TextView 更改适用于使用 ListView 和 ArrayAdapter 的多个 TextView

Posted

技术标签:

【中文标题】TextView 更改适用于使用 ListView 和 ArrayAdapter 的多个 TextView【英文标题】:A TextView change applies to multiple TextViews using ListView and ArrayAdapter 【发布时间】:2016-01-13 13:43:42 【问题描述】:

不久前我开始从事一个小项目,主要目标是为我打造一种方法来跟踪我在 100 周内的行为。

我还是一个新手 android 开发者,我遇到了一个我无法解释的问题。

基本上我已经使用 ArrayAdapter 填充了一个 ListView,其中包含一个包含 100 个字符串(Week1、Week2、Week3 ... Week100)的列表

在每个 TextView 上设置一个 onclicklistener,这样当用户点击一个 textview 时,背景颜色会变为红色。

但是;每当我单击一个文本视图时 - 不止一个文本视图被着色。

注意事项:

    我正在使用 ScrollView 滚动整个列表。 (填充后,100 周列表会填满整个屏幕,滚动视图用于访问整个列表。)

    我还保存了对当前绘制的 textview 的引用,这样我可以确保当用户单击不同的 textview 时,前一个 textview 会失去其红色背景。

MainActivity 初始化:

public class MainActivity extends ActionBarActivity 

TextView selectedWeek; // Reference to the selected week.
@Override
protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    populateWeekList(); // Populating the ListView
    initWeekClick(); // Initializing click listener

填充 ListView:

public void populateWeekList()

    String[] weeks = new String [100]; // 100 weeks
    for (int i=0; i<100;i++)
    
        weeks[i] = "Week"+(i+1);
    
    ArrayAdapter<String> weekAdapter = new ArrayAdapter<String>(
            this,
            R.layout.weeksview,
            weeks
    );

    // R.id.weekTypeList is just a normal TextView.
    ListView weekList=(ListView) findViewById(R.id.weekTypeList); 
    weekList.setAdapter(weekAdapter);

用于初始化 onClickListener 并保存 selectedWeek 引用的代码:

public void initWeekClick()

    ListView weekList=(ListView) findViewById(R.id.weekTypeList);
    weekList.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    
        @Override
        public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) 
        
            if (selectedWeek != null) 
            
                selectedWeek.setBackgroundColor(0);
            
            TextView clicked = (TextView) viewClicked;

            // Change clicked TextView color to red.
            clicked.setBackgroundColor(getResources().getColor(android.R.color.holo_red_light));

            // Save the selected week reference
            selectedWeek = clicked;
        
    );

【问题讨论】:

【参考方案1】:

好的,您的背景正在随机播放,因为当您滚动 ListView getView() 时,它会考虑您当前的 TextView 位置(作为当前 view)并在检测到 @987654322 时在其上设置背景@方法onClick监听器就可以了..

首先我建议创建一个Adapterextends ArrayAdapter&lt;?&gt;

解决方案 1:

在您的文本视图上使用setTag() onClick 监听器,例如..

text.setTag(position);

在上面使用getTag()并设置条件

if(holder.text.getTag().equals(position))
    holder.text.setBackgroundColor(Color.BLUE);
else
    holder.text.setBackgroundColor(Color.WHITE);

解决方案 2:

将此添加到onCreate 方法

    ArrayList<String> _array = new ArrayList<String>();
    for(int i=0 ; i <1000; i ++)                       // 1000 value
        _array.add(i+"");                
    
    list.setAdapter(new  MainAdapter(this, _array));        // pass you list here

ArrayAdapter 类:

public class MainAdapter extends ArrayAdapter<String> 

    ArrayList<String> _st = new ArrayList<String>();
    ArrayList<Integer> check = new ArrayList<Integer>();
    Context _context;
    public MainAdapter(Context context,ArrayList<String> _st) 
        super(context,R.layout.main, _st);        // your inflate layout
        this._context = context;
        this._st = _st;

    
    @Override
    public int getCount() 
        return _st.size();
    
    @Override
    public long getItemId(int position) 
        return 0;
    
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) 

        //---//

        // check if current position is there in arraylist
        if(checking(position))
            holder.text.setBackgroundColor(Color.BLUE);
        else
            holder.text.setBackgroundColor(Color.WHITE);
        
        holder.text.setOnClickListener(new OnClickListener() 
            @Override
            public void onClick(View arg0) 
                // set background and put value in array list
                holder.text.setBackgroundColor(Color.BLUE);
                check.add(position);

            
        );
        return convertView;
    

    // this will check whether current position is there is array list or not and if it there it will break loop and return true
    public boolean checking(int position)
        boolean fine = false;
        for(int i=0; i<check.size();i++)
            if(position == check.get(i))
                fine = true;
                break;
            
        
        return fine;
           
  
  public class ViewHolder
      TextView text;
  

我不知道我在这段代码中有多少道德......但正如你所指定的那样,你有 100 价值。我已经在 1000 价值上对其进行了测试它起作用了

我不是专家,所以如果我在某个地方错了,请告诉我

希望有用!!!

【讨论】:

R.id.text 是什么意思?你指的“文本”是什么?这必须是动态的,用户可以点击 100 个 TextView 中的任何一个 你的R.layout.weeksview中的TextView的id 数组适配器创建了 100 次,我如何区分它们,我尝试将单击的视图传递给引用,因此,从逻辑上讲,我应该只访问一个 TextView。 问题是多个Textviews的背景发生了变化。例如:用户点击“Week1”,它被涂成红色。 - 到目前为止,一切都很好。然而;当您向下滚动时,您会注意到“Week11”、“Week21”、“Week31”……等等,也会被绘制出来。 我已经改变了我的答案..看看它......请根据你的改变变量..

以上是关于TextView 更改适用于使用 ListView 和 ArrayAdapter 的多个 TextView的主要内容,如果未能解决你的问题,请参考以下文章

动态更改 ListView 中三个不同组的 TextView 颜色

在 ListView 适配器的 getView(...) 中更改 TextView 颜色和文本

从android中的对话框更改TextView文本

从ArrayAdapter每毫秒更新Android ListView中的一行

ListView,更改错误的项目视图

savedInstanceState - 可见性更改未恢复?