关于ListView的Item含有CheckBox所遇到的一些问题
2017-01-06 15:27
495 查看
这是我作为一个并不是很NB的Android开发人员的第一篇博文,书写一些我自己遇到的问题,希望对你们有所帮助。如果有更好的见解,望能够提出,如果我有错误,也希望多多指教。
问题1:
listView点击事件与CheckBox点击冲突问题:
如果不做任何处理,会发现只能选择Checkbox,而你设置的listView中item点击事件没有反应,这是因为checkBox的点击事件优先级高于listview的点击事件,需要做的处理是:添加android:focusable=”false”
问题2:
获取到你所选中的listView的item的内容(可能是多条):
首先我们一个list保存CheckBox的选中状态,默认false,
然后在Adapter中,当你点击CheckBox的时候,更改list中你所保存的状态。
这样你就可以获取到,整个listView中CheckBox的状态。我们便可以将True的取出来,即选中的内容
问题3:
listView的item复用问题,导致CheckBox的选中状态,会随着滑动发生错变:
如果你不对其做处理。但你选中一项后,滑动listView,因为复用问题,当选中的一条滑出屏幕再显示出来,选中状态会改变;或者是新滑进屏幕的一些选项默认成了选中状态,这就需要我们记住他们的状态即可。
如果你做了问题2所做的处理,那就很简单了。
只需要在adapter赋值操作中。将你所保存的Checkbox状态赋值给他就ok了。
目前我所遇到的问题,用上述方法都可以解决。贴上代码:
MainActivity 代码
适配器代码
问题1:
listView点击事件与CheckBox点击冲突问题:
如果不做任何处理,会发现只能选择Checkbox,而你设置的listView中item点击事件没有反应,这是因为checkBox的点击事件优先级高于listview的点击事件,需要做的处理是:添加android:focusable=”false”
<CheckBox android:id="@+id/button" android:layout_width="30dp" android:onClick="click" android:layout_height="match_parent" **android:focusable="false"**/>
问题2:
获取到你所选中的listView的item的内容(可能是多条):
首先我们一个list保存CheckBox的选中状态,默认false,
private List<Boolean> mChecked = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { mChecked.add(false); }
然后在Adapter中,当你点击CheckBox的时候,更改list中你所保存的状态。
holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox); holder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mChecked.set(position, holder.checkBox.isChecked()); } });
这样你就可以获取到,整个listView中CheckBox的状态。我们便可以将True的取出来,即选中的内容
for (int i = 0; i < mChecked.size(); i++) { if (mChecked.get(i).equals(true)) { list.get(i).get*** //做你所需要的处理 } }
问题3:
listView的item复用问题,导致CheckBox的选中状态,会随着滑动发生错变:
如果你不对其做处理。但你选中一项后,滑动listView,因为复用问题,当选中的一条滑出屏幕再显示出来,选中状态会改变;或者是新滑进屏幕的一些选项默认成了选中状态,这就需要我们记住他们的状态即可。
如果你做了问题2所做的处理,那就很简单了。
只需要在adapter赋值操作中。将你所保存的Checkbox状态赋值给他就ok了。
holder.checkBox.setChecked(mChecked.get(i));
目前我所遇到的问题,用上述方法都可以解决。贴上代码:
MainActivity 代码
public class MainActivity extends AppCompatActivity { private ListView listView; private List<listBean> list = new ArrayList<>(); private List<Boolean> mChecked = new ArrayList<>(); private String JsonStr = "";//自己整点数据源即可 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initListView(); } private void initListView() { list = com.alibaba.fastjson.JSONArray.parseArray(JsonStr, listBean.class); //初始化选中状态,默认全不选中 mChecked = new ArrayList<Boolean>(); for (int i = 0; i < list.size(); i++) { mChecked.add(false); } //放到Adapter的构造中,为了传回mChecked,在Activity中处理 MyAdapter adapter = new MyAdapter(mChecked,list, MainActivity.this); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { //listView点击事件 } }); } private void initView() { listView = (ListView) findViewById(R.id.listView); } //Toast出你选中的某些项的内容(做你的处理) public void click(View view) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < mChecked.size(); i++) { if (mChecked.get(i).equals(true)) { builder.append(list.get(i).getCtname()+"\n"); } } Toast.makeText(this, builder, Toast.LENGTH_SHORT).show(); } }
适配器代码
public class MyAdapter extends BaseAdapter {
private List<Boolean> mChecked;
private List<listBean> list;
private Context context;
public MyAdapter(List<Boolean> mChecked, List<listBean> list, Context context) {
this.mChecked = mChecked;
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
final ViewHolder holder;
if (convertView==null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.layout_item, null);
holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
holder.name = (TextView) convertView.findViewById(R.id.name);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.name.setText(list.get(i).getCtname().toString());
holder.checkBox.setChecked(mChecked.get(i));
final int position = i;
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mChecked.set(position, holder.checkBox.isChecked());
}
});
return convertView;
}
class ViewHolder{
private CheckBox checkBox;
private TextView name;
}
}
相关文章推荐
- listview的item中含有checkbox的一些问题
- listView的item中含有checkbox的一些问题及解决办法
- 关于ListView的item中包含Button或Checkbox时导致item无法点击问题
- 关于ListView的item中含有checkbox,并判断选中的数目
- 关于ListView+CheckBox,Item超过一屏时数据乱序和不能全部选中的问题
- 自定义ListView item包含checkbox实现单选记录自己开发是遇到的问题
- 关于android ListView倒计时遇到的一些问题
- 关于ListView+CheckBox,Item超过一屏时数据乱序和不能全部选中的问题
- Gridview, ListView中的item含有checkbox,setOnItemClickListener方法失效的问题
- 在ListView的item项里使用CheckBox或者Button时,OnItemClickListener无响应的问题
- 关于局部更新listview的问题(只更新某个item)
- 关于android开发遇到的一些问题的解决办法---间断的更新
- 关于tomcat服务器优化,常遇到的一些简单问题的解决方法 (z)
- 关于在配置Samba服务器遇到的一些问题!
- ListView的Item中CheckBox焦点优先于ListView的问题
- 关于多线程遇到的一些问题
- 关于PHP采集网站内容的一些思路--遇到的问题
- 在做含有CheckBox的Adapter的可能会遇到的问题:
- 曾经遇到的一些 关于 html 中 li 标签的问题
- 关于ListView中Item的高度问题