Android-为什么我自定义的listview会自动选择单选按钮?

小组事务管理 小组事务管理 主题:974 回复:1955

Android-为什么我自定义的listview会自动选择单选按钮?

灵芸 发布于 2017-03-10 字数 3773 浏览 1040 回复 6

我遇到一个很奇怪的现象,不知道为什么,我设置了一个自定义的listview,在里面放进了一些题目,并且提供一组单选按钮.奇怪的是,每次一点单选按钮就会出现有其他非人手操作的自动选择的现象.并且好像都是相隔10个条目.更奇怪的是,后来我发现了只要上下拖动listview就会出现自动改变选择了的题目的情况(例如:选择了第二题否,上下拖动listview之后会出现变成选择了第三题或者其他题目的否,而第二题则变回默认的是选项)
求大神帮我看看我的BaseAdapter代码是不是有问题,因为我对自定义listview其实不是很熟悉,代码是网上找来修改的

package qinxianyuzou.jirouguliang.main;

import java.util.ArrayList;
import java.util.HashMap;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class MyAdapter extends BaseAdapter
{

private Context context; // 运行上下文
private ArrayList<HashMap<String, Object>> listItems; // 题目
private LayoutInflater listContainer;// 视图容器

public MyAdapter(Context context,
ArrayList<HashMap<String, Object>> listitem)
{
this.context = context;
listContainer = LayoutInflater.from(context); // 创建视图容器并设置上下文
this.listItems = listitem;
}

public final class listview
{
public TextView textView;
public RadioGroup radioGroup;
public RadioButton radioButton0;
public RadioButton radioButton1;
}

public int getCount()
{
return listItems.size();
}

public Object getItem(int arg0)
{
return null;
}

public long getItemId(int arg0)
{
return 0;
}

public View getView(int position, View convertView, ViewGroup arg2)
{
final int selectID = position;
// 自定义视图
listview listItemView = null;
if (convertView == null)
{
listItemView = new listview();
convertView = listContainer.inflate(R.layout.list_layout, null);
// 获取控件对象
listItemView.textView = (TextView) convertView
.findViewById(R.id.list_layout_text);
listItemView.radioGroup = (RadioGroup) convertView
.findViewById(R.id.list_layout_radioGroup1);
listItemView.radioButton0 = (RadioButton) convertView
.findViewById(R.id.list_layout_radio0);
listItemView.radioButton1 = (RadioButton) convertView
.findViewById(R.id.list_layout_radio1);
convertView.setTag(listItemView);
}
else
{
listItemView = (listview) convertView.getTag();
}
listItemView.textView.setText((selectID + 1) + "."
+ (String) listItems.get(selectID).get("TiMu"));
if (listItemView.radioButton0.isChecked())
{
MainActivity.xuanxiang.append(selectID + 1, 1);
}
else
if (listItemView.radioButton1.isChecked())
{
MainActivity.xuanxiang.append(selectID + 1, 2);
}
else
{
Toast.makeText(context, "第" + (selectID + 1) + "题还没有选择哦",
Toast.LENGTH_SHORT).show();
}

return convertView;
}

}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(6

想挽留 2017-10-13 6 楼

把你的商品信息中,添加一个是否被选中的字段,然后再getview的时候,根据这个字段来显示是否被选中。推荐你看看http://www.cnblogs.com/over140/archive/2011/03/23/1991100.html
或者百度搜索Listview重用

想挽留 2017-09-19 5 楼

简单的说,系统是不知道你点击的那个。说明你没有对点击的位子进行存储,你可以尝试用viewHolder.box.setChecked(map.get(position));然后在MyAdapter实例方法时候加入map = new HashMap<Integer, Boolean>();
for(int i = 0; i < mNicks.length; i++) {
map.put(i, false);你的判断,这样就没问题了。

灵芸 2017-05-19 4 楼

你把convertView==null的判定条件去掉试试,就是不使用缓存view

想挽留 2017-05-08 3 楼

更改传递给适配器的数据,使哪一个单选框被选择不是有它自身的点击事件决定的,而是由数据中的一个标志位决定的。
使单选框不可点击,如在1中所说,单项框状态不由自身的点击决定。
增加listview中一列的点击事件,点击时更改标志位。然后通知数据改变。这样只要点击这一列即可更改选择项。
以上方法应该可以解决你的问题,可能叙述不大好,希望可以看懂

虐人心 2017-05-02 2 楼

你这个问题是list item中的view初始化的问题。

每一个item每次被展示的时候,都需要初始化。真实的情况不是adapter有多少Item,就有多少个view,而是系统在不断的复用。所以需要你每次看到一个item的时候,你都要初始化数据。

回到你原始的问题,你想解决的是每次点击后获得他的位置或者数据,你完全可以用一个全局变量去存储这个数据的标志,到展现这个item,需要你先去setChceck下

简单demo如下:

if(getItem(position).id==your_save){
checkBox .setChecked(true);
}else{
checkBox .setChecked(false);
}

想挽留 2017-03-27 1 楼

你把listview设置这个属性试下,android:choiceMode=none