android listview 增加单选 复选,ListView里面加入CheckBox如何实现单选?

2e999c923542876b8ac7bcf4149ede78.gif

这个的问题也就是点击的时候 checkbox的选项会乱的问题

这个问题的解决很好解决,一个map或者实体类中加个字段就可以搞定。如果想彻底掌握也不麻烦,我这个人不太喜欢贴代码,谈谈原理仅作参考

了解listview加载原理和优化原理即可明白怎么做

1、listview加载原理

listview在适配后不只加载界面上的几个item,也就预加载界面上下相邻的一个item,按照这个规律在滑动后销毁和加载对用item

2、优化原理

viewholder的优化是防止每次都载入view,也就是View.inflate加载view的代码,防止每次都findviewbyid,

那也就是说通常情况listview配置的时候反复用一个viewhoder,而viewhoder中存储着对应的控件,那如果在滑动的过程中我点击了某个item后  那viewhoder中的控件也被操作了,那你滑动后加载的item都是操作后的控件,这样就会出现点击一个item往下滑动 发现所有item都被选中了

解决办法:

可实体类加上标识,是否被选中

在选中的事件中将标识改为true  在getView中按照标识判断checkbox的选中状态即可

9258053d1db5c3a98fd0bb7bdd5778fd.png

给你一个示列:

1:首先list列表的布局文件中插入一个checkBox如下: android:layout_width="wrap_content"android:layout_height="wrap_content"/ >

然后再在BaseAdapter的getView(final int position, View convertView, ViewGroup parent)方法里面实例化Checkbox:

如下:(其中ll是ListView标签的实例化)CheckBox checkBox = (CheckBox) ll.findViewById(R.id.checkbox_item);

接着就是为checkBox设置选中事件的监听了,如下:/*checkbox的选中事件*/checkBox.setOnCheckedChangeListener(newCompoundButton.OnCheckedChangeListener() {

@Overridespan="">style="color:#bbb529;" > public voidonCheckedChanged(CompoundButton buttonView, booleanisChecked) {

Toast.makeText(MainActivity.this,"你选中了第" (position 1) "个checkbox",Toast.LENGTH_SHORT).show();}

});

如有帮助到你,请采纳额

9258053d1db5c3a98fd0bb7bdd5778fd.png

f64575537338715bba7052e868a181f7.png

2e999c923542876b8ac7bcf4149ede78.gif

public class ContentAdapter extends BaseAdapter {

private LayoutInflater mInflater;

private List lists;

private static HashMap isSelectedMap;

public ContentAdapter(List lists, Context context) {

mInflater = LayoutInflater.from(context);

this.lists = lists;

isSelectedMap = new HashMap ();

for (int i = 0; i < lists.size(); i ) {

getIsSelected().put(i, false);

}

}

@Overridepublic int getCount() {

return lists.size();

}

@Overridepublic Object getItem(int position) {

return lists.get(position);

}

@Overridepublic long getItemId(int position) {

return position;

}

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {

final String str = lists.get(position);

final ViewHolder holder;

if (convertView == null) {

holder = new ViewHolder();

convertView = mInflater.inflate(

R.layout.listview_item, null);

holder.mTV = (TextView) convertView

.findViewById(R.id.textview)

holder.mCB = (CheckBox) convertView

.findViewById(R.id.checkbox);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.mTV.setText(str);

final int tempPosition = position;

holder.mCB.setOnClickListener(new OnClickListener() {

@Overridepublic void onClick(View v) {

if (((CheckBox) v).isChecked()) {

getIsSelected().put(tempPosition, true);

} else {

getIsSelected().put(tempPosition, false);

}

}

});

holder.mCB.setChecked(getIsSelected().get(position));

return convertView;

}

private class ViewHolder {

TextView mTV;

CheckBox mCB = null;

}

public HashMap getIsSelected() {

return isSelectedMap;

}

public void setIsSelected(HashMap isSelected) {

isSelectedMap = isSelected;

}

}

2e999c923542876b8ac7bcf4149ede78.gif

#4楼   @樱蝴蝶  我把代码都已经写入了~但是就是没实现出效果啊~还是每一个都能选择,都能取消,我附图,还有是不是前面需要刷新适配器啊??

0ce771be92254b0ff1526b1382aeddc8.png

0b450a53fac11e25b4ed74fbef204c77.png

ca61741f40c07d83fb4f2886cc44f1b3.png

下面是前面类 传参的界面

6633b53a55f50123d404f5e50ac7048b.png

2e999c923542876b8ac7bcf4149ede78.gif

#5楼   @Eric_xiaohei如果你要单选  建议你选择使用radiobutton

2e999c923542876b8ac7bcf4149ede78.gif

#5楼   @Eric_xiaohei如果你要单选  建议你选择使用radiobutton

2e999c923542876b8ac7bcf4149ede78.gif

#7楼   @樱蝴蝶改成RadioButton 但是 还是不行啊~能选上,但是其他的按钮不会取消,还有在点同一个按钮 始终被选中状态

2e999c923542876b8ac7bcf4149ede78.gif

#8楼   @Eric_xiaohei   恩  你要将之前的那部分判断改一下的,之前判断是用于多选的,默认某个position的状态为true  代表选中,然后你选择其他的时候做判断   是否该position的状态是选中还是未选中,选中的设为true,其他全为false

2e999c923542876b8ac7bcf4149ede78.gif

#2楼   @木头同学  判断后怎么让适配器刷新啊?感觉点完没有什么反应啊

2e999c923542876b8ac7bcf4149ede78.gif

#1楼   @切克切克_闹  判断后怎么让适配器刷新啊?感觉点完没有什么反应啊

2e999c923542876b8ac7bcf4149ede78.gif

#11楼   @Eric_xiaohei

你试试这个   布局的话你自己修改下好了,main里面只放了一个listview    listview_item里面只放了一个radiobuttonpackage com.happydeerlet.radiolistview;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import android.app.Activity;

import android.content.Context;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.BaseAdapter;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.RadioButton;

public class MainActivity extends Activity {

private ListView listView;

private int selectedId = 0;

private ContentAdapter contentAdapter;

private List list;

@Overrideprotected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

listView = (ListView) this.findViewById(R.id.listview);

list = new ArrayList < >();

for (int i = 0; i < 20; i ) {

list.add("list:" i);

}

contentAdapter = new ContentAdapter(this);

listView.setAdapter(contentAdapter);

listView.setOnItemClickListener(new OnItemClickListener() {

@Overridepublic void onItemClick(AdapterView > parent, View view,

int position, long id) {

for (int i = 0; i < list.size(); i ) {

contentAdapter.getStates().put(i, false);

}

contentAdapter.getStates().put(position, true);

selectedId = position;

contentAdapter.notifyDataSetChanged();

}

});

}

class ContentAdapter extends BaseAdapter {

private HashMap states;

public ContentAdapter(Context context) {

states = new HashMap ();

for (int i = 0; i < list.size(); i ) {

getStates().put(i, false);

}

}

@Overridepublic int getCount() {

return list.size();

}

@Overridepublic Object getItem(int position) {

return list.get(position);

}

@Overridepublic long getItemId(int position) {

return position;

}

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {

final String str = list.get(position);

LinearLayout layout = null;

if (convertView == null) {

LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

layout = (LinearLayout) inflater.inflate(R.layout.listview_item, null);

} else {

layout = (LinearLayout) convertView;

}

RadioButton mRadioButton = (RadioButton) layout

.findViewById(R.id.radiobutton);

mRadioButton.setText(str);

if (selectedId == position) {

states.put(position, true);

selectedId = position;

}

if (states.get(position) == null || states.get(position) == false) {

states.put(position, false);

} else {

}

mRadioButton.setChecked(getStates().get(position));

return layout;

}

public HashMap getStates() {

return states;

}

public void setIsSelected(HashMap isSelected) {

states = isSelected;

}

}

}

9258053d1db5c3a98fd0bb7bdd5778fd.png

#10楼   @Eric_xiaohei  怎么会没有反应 ,你要啥反应,适配器只能添加移除数据项,然后重新为视图设置adapter。

2e999c923542876b8ac7bcf4149ede78.gif

#11楼   @Eric_xiaohei  你在getView写的,那时候是生成item要什么刷新,如果是已经展示的item 你点击后已经操作了

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值