如何防止修改后的列表视图项被重用,或者至少在重新初始化之前不被重用

时间:2012-12-19 11:05:27

标签: android android-layout

MyListViewAdapter内部,我直观地对convertView进行了更改,但随着列表的重复使用,这些更改会在其他行项上保留。换句话说,现在每一行都是红色的。怎么办?我该如何防止这种情况?

 View getView(View convertView, int position etc)
 {
      Button myButton = (Button)convertView.findViewById(R.id.myButton);
      myButton.setTag(convertView);
      myButton.setOnclickListener( new OnClickListener(){

           public void onClick(View v){
             View containingView = myButton.getTag();
             containingView.setBackgroundColor(Color.RED);
           }


      });

 }

问题是视图被重用,所以现在我在其他地方有一个红色列表项,而不仅仅是代表我想要的视图的单元格的位置。这是什么解决方案?如何防止视图以这种方式重用?

4 个答案:

答案 0 :(得分:0)

使用ViewHolder模式:

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_row, null);
            holder = new ViewHolder();
            holder.button = (Button)convertView.findViewById(R.id.button);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }

        holder.button.setOnclickListener(new OnClickListener(){

           public void onClick(View v){
             v.setBackgroundColor(Color.RED);
           }


      });

        return convertView;
    }

private class ViewHolder{
   public Button button;
}

答案 1 :(得分:0)

您必须手动设置它,然后将红色位置保存在支架之类的东西上,并验证选择正确的颜色。

答案 2 :(得分:0)

一般建议,在编码之前,你应该多阅读一下适配器。

简单:

  1. 之前我告诉过你,只创建一个onClickListener。你浪费了很多记忆
  2. 如果convertView为null,则仅执行初始化工作。
  3. 您必须跟踪单击的视图,并在每个getView上设置/重置颜色。

       View getView(View convertView, int position etc)
        {
             if(convertView == null{
                 convertView = // inflate it
                 colorStatusMap.put(h.position, defaultColor);
                 convertView.findViewById(R.id.myButton).setOnClickListener(clickListener);
                 convertView.findViewById(R.id.myButton).setTag(convertView);
             }
             convertView.setBackgroundColor(colorStatusMap.get(position));
             convertView.setTag((Integer)position);
    
    
        }
    
        private OnClickListener clickListener = new OnClickListener(){
    
                  public void onClick(View v){
                    View containingView = v.getTag();
                    containingView.setBackgroundColor(Color.RED);
                    int position = (Integer)containingView.getTag();
                    colorStatusMap.put(position, Color.RED);
                  }
        }
        private HashMap<Integer, Integer> colorStatusMap = new HashMap<Integer, Integer>();
    
  4. ps。:我用心脏打字并且没有实际编译和检查它,但你可以知道你应该做什么。如果我的代码出现任何错误的可能性很小,您可以修复它们。

答案 3 :(得分:0)

尝试一次

这是一个小代码供您使用:我将创建一个布尔arraylist。

private ArrayList<Boolean> item_clicked = new ArrayList<Boolean> ();

然后我将在构造函数中将所有行元素的状态设置为false:

for (int i=0; i < no_of_elements.size(); i++) {
    item_clicked.add(i, false);
}

单击行时设置实际单击状态: myButton.setOnclickListener(new OnClickListener(){

       public void onClick(View v){
         item_clicked.set(position, true);
         View containingView = myButton.getTag();
         containingView.setBackgroundColor(Color.RED);
       }


  });

在你的getview方法中给出这个条件

if (item_clicked.get(position)) {
//SET BACKGROUD AS RED
} else {
// SET BACKGROUND AS NORMAL COLOR
}