您的位置:首页 > 其它

关于ListView的Item含有CheckBox所遇到的一些问题

2017-01-06 15:27 495 查看
这是我作为一个并不是很NB的Android开发人员的第一篇博文,书写一些我自己遇到的问题,希望对你们有所帮助。如果有更好的见解,望能够提出,如果我有错误,也希望多多指教。

问题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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: