0

在内部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

4 回答 4

0

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

于 2012-12-19T11:14:07.810 回答
0

试试这个

这里有一些代码可以帮助你:我将创建一个布尔数组列表。

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
}
于 2012-12-19T12:12:46.193 回答
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;
}
于 2012-12-19T11:11:33.417 回答
0

一般建议,您应该在编码之前阅读更多关于适配器的内容。

简单的:

  1. 我之前告诉过你只创建一个 onClickListener。你浪费了很多内存
  2. 仅当 convertView 为空时才进行初始化工作。
  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>();
    

ps.:我把所有这些都记下来了,没有实际编译和检查,但你可以知道你应该做什么。在我的代码中出现任何错误的不太可能的情况下,您可以在修复它们时获得一些乐趣。

于 2012-12-19T11:27:18.557 回答