2016-08-08 165 views
0

发生了一些奇怪的事情,当我点击列表中的一行时,相应的复选框也被选中。所以一切都是正确的,但奇怪的是,自动每7行复选框setcheked为true。 什么问题?感谢您的帮助Android listview getView checkBox

ListAdapter adapter = new ArrayAdapter<Dettaglio1> 
      (this, R.layout.deteails_list_pdf, R.id.tv_nome_categoria, dettagli1) { 
@Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      View row = super.getView(position, convertView, parent); 
... 
... 
list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        final Dettaglio1 d1 = dettagli1.get(position); 

        d1.setChecked(!d1.isChecked()); 

        CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox2); 
        checkBox.setChecked(d1.isChecked()); 

       } 
      }); 
      return row; 
     } 
    }; 
    list.setAdapter(adapter); 

private class Dettaglio1 { 
    String nome; 

    private boolean isChecked; 

    public void setChecked(boolean isChecked) { 
     this.isChecked = isChecked; 
    } 

    public boolean isChecked() { 
     return isChecked; 
    } 
} 
+0

你能发布你的布局文件吗? – manfcas

回答

1

发生了什么事被称为视图回收 - 的核心机制背后ListViewRecyclerView。每7日检测一次CheckBox,因为这与CheckBox回收并显示其以前的状态相同。

要解决您的问题,您需要在数据模型(Dettaglio1类)中保持“已检查”状态。例如,你可以修改你的数据模型,如下所示:

public class Dettaglio1 { 
    // stuff 
    private boolean isChecked; 

    public void setChecked(boolean isChecked) { 
     this.isChecked = isChecked; 
    } 

    public void isChecked() { 
     return isChecked; 
    } 
    // more stuff 
} 

而且你的听众,像这样:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    final Dettaglio1 d1 = dettagli1.get(position); 
    d1.setChecked(!d1.isChecked()); 

    CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox2); 
    checkBox.setChecked(d1.isChecked()); 
} 

编辑: 您还需要重写你的适配器的getView()方法,并设置CheckBox根据当前位置的Dettaglio1检查状态。

+0

此解决方案不能解决问题。我编辑了我的帖子 – user2847219

+0

哦,对。编辑我的帖子。 – npace