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

我遇到一个很奇怪的现象,不知道为什么,我设置了一个自定义的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;
}

}

另外附带上这个自定义的布局文件

  
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
android:id="@+id/list_layout_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center" >

<RadioGroup
android:id="@+id/list_layout_radioGroup1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal" >

<RadioButton
android:id="@+id/list_layout_radio0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/list_layout_radio0" />

<RadioButton
android:id="@+id/list_layout_radio1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="200dp"
android:text="@string/list_layout_radio1" />
</RadioGroup>
</LinearLayout>

</LinearLayout>
评论 (2)链接2012-08-09 
  • 0 支持
    这个问题网上很多的,主要是listview重用引起的,你最好对每个选择做一个标记。 – 蜗牛漫步 2012-08-09
  • 0 支持
    @蜗牛漫步 做什么样的标记? – 琴弦欲奏 2012-08-09

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

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

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

简单demo如下:

  
if(getItem(position).id==your_save){
checkBox .setChecked(true);
}else{
checkBox .setChecked(false);
}
andev
编辑于 2012-08-10
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-08-10

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

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-08-09

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

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-08-10

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

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (1)链接 • 2012-08-09
  • 0 支持
    去掉之后会出现一滚动所有选项都还远默认的选项 – 琴弦欲奏 2012-08-09
  1. 更改传递给适配器的数据,使哪一个单选框被选择不是有它自身的点击事件决定的,而是由数据中的一个标志位决定的。
  2. 使单选框不可点击,如在1中所说,单项框状态不由自身的点击决定。
  3. 增加listview中一列的点击事件,点击时更改标志位。然后通知数据改变。这样只要点击这一列即可更改选择项。
  4. 以上方法应该可以解决你的问题,可能叙述不大好,希望可以看懂
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (4)链接 • 2012-08-09
  • 0 支持
    关于第三点有点疑惑,给listview设置单击事件,怎么判断他选的是什么单选按钮? – 琴弦欲奏 2012-08-09
  • 0 支持
    @琴弦欲奏 这是在默认这一列只有单选按钮的情况下,只要点击了这一列,就表示执行选择此列,或者不选择此列。如果是这种情况用复选框更好。 – 李争 2012-08-10
  • 0 支持
    @李争 我是想知道怎么返回他单击的列?在listview里面貌似没有列这个说法吧? – 琴弦欲奏 2012-08-10
  • 0 支持
    @琴弦欲奏 每一条数据不是一列吗,或者说是一行、单条数据、一项都行。setOnItemClickListener()不就是单击事件吗? – 李争 2012-08-10

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

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-08-10
德问是一个专业的编程问答社区,请 登录注册 后再提交答案