复选框在列表被意外检查
-
20-09-2019 - |
题
我具有由自定义simpleCursorAdapter
绑定列表的复选框的列表。
在我的自定义simpleCursorAdapter
,我已经覆盖newView
和bindView
我修改。
我已经成功在某种程度上做multichoice。
该奇怪的是,我从我的列表中删除的任何项目后,第一项的复选框被检查突然。如何发生的?我该如何解决呢?
我SimpleCursorAdapter
类:
public class MyListCursorAdapter extends SimpleCursorAdapter
{
private Context context;
private int layout;
public MyCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to)
{
super(context, layout, c, from, to);
this.context = context;
this.layout = layout;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{
Cursor c = getCursor();
final LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(layout, parent, false);
CheckBox chkBoxBtn = (CheckBox) v.findViewById (R.id.deleteTwittChkBox);
if (chkBoxBtn != null)
{
chkBoxBtn.setChecked(false);
}
return v;
}
@Override
public void bindView(View v, Context context, Cursor c)
{
--binding view to my textsview in my items
//now it's the importat part:
CheckBox chkBoxBtn = (CheckBox) v.findViewById(R.id.deleteTwittChkBox);
if (chkBoxBtn != null)
{
chkBoxBtn.setId(Integer.valueOf(c.getString(c
.getColumnIndex(MyUsers.User._ID))));
chkBoxBtn.setOnClickListener(new OnItemClickListener(chkBoxBtn, v));
chkBoxBtn.setChecked(false);
}
}
//i couldnt find another way of doing this, but this is how i set listeners to my checkboxses
static ArrayList<String> checkedItemsList = new ArrayList<String>();
private class OnItemClickListener implements OnClickListener
{
private int mPosition;
private CheckBox chkBox;
OnItemClickListener(CheckBox mChkBox, View v)
{
chkBox = mChkBox;
chkBox.setChecked(false);
}
@Override
public void onClick(View v)
{
if (chkBox.isChecked())
{
checkedItemsList.add(String.valueOf(chkBox.getId()));
}
else
{
checkedItemsList.remove(String.valueOf(chkBox.getId()));
}
}
}
}
下面是代码部分从ListActivity
类其描述了删除检查框项目按钮:
OnClickListener btListener = new OnClickListener()
{
public void onClick(View view)
{
// long[] items = listView.getCheckItemIds();
int x = 0;
Uri myUri = Uri
.parse("content://com.idan.datastorageprovider/users");
String where = "_id" + "=?";
//here i am tatking all checkboxes which ive added from the adapter class
ArrayList<String> checkedItemsList = MySimpleCursorAdapter.checkedItemsList;
for (String itemID : checkedItemsList)
{
getContentResolver()
.delete(myUri, where, new String[] { itemID});
checkedItemsList.remove(itemID);
}
}
};
解决方案
我怀疑SimpleCursorAdapter到这里延伸的权利类。
是“选中”状态连接到以任何方式数据XML?没有?所以,你需要自己的自定义适配器!
基本上所有适配器必须执行一种方法来产生从给定的元素的视图(更精确的元件位置!)。这将在其列表要显示的元素随时调用。现在,它使用的伎俩是重新使用以前创建的列表视图元素不能在屏幕上看到的更多!因此:当您滚动列表下来的一个元素的顶部消失,正是这种视图对象将被重新用于下一个出现的项目
因此,当调用此方法与应被重新使用给定的“旧”视图中,所有包含的元素将不得不根据元素的数据来设置。如果复选框是这个游戏的一部分,你必须拥有的选中状态的存储!这是不足以具有复选框一样会有更少复选框对象作为有列表元素!
SimpleCursorAdapters在那里 - 是 - 表示简单的事情。描述数据(图像和文本,如文档状态)的XML。由于这种简单的你要在这里做的是提供一个方法来创建新的元素视图对象 - 你是不是拦截的再利用过程了!它基本上只知道如何把数据插入现有视图对象 - 但它缺乏如何处理选中/取消复选框知识
您的解决方案:写自己的BaseAdapter延伸,做必须做:实施“getView”(和其他一些方法,如的getItem,getItemId和getCount将)。这是不难的!
此 API演示一>使用BaseAdapter和这里的mExpanded
状态基本相同,您的复选框的状态!
祝你好运!
其他提示
您可能需要调用 notifyDataSetChanged 时修改数据。
这个问题可能是你正在调用从onItemClickListener内setChecked。解决此问题的哈克的方式是你叫从您的听众中setChecked之前和之后的情况如下:
chkBox.setClickable(false);
chkBox.setChecked(false);
checkBox.setClickable(true);
这会防止你onItemClickListener从获取调用,当你手动调用setChecked。