我在listview上遇到了麻烦。我在listview中添加了一个复选框来选择项目。我的数据来自sqlite所以我使用简单的游标适配器。我的名单的长度是aproximatley 250行。我点击一个复选框。当我向下滚动页面(列表)时,每10行单击一次复选框。(例如在我的屏幕显示10行数据时,当我滚动第11行时,此行的复选框已被点击。我该如何解决这个问题。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
/>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/checkBox"
android:textStyle="bold"
android:text="TextView" />
<TextView
android:id="@+id/nick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/nick"
android:layout_alignBottom="@+id/nick"
android:layout_alignParentRight="true"
android:text="TextView" />
<TextView
android:id="@+id/phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/name"
android:layout_toRightOf="@+id/checkBox"
android:text="TextView" />
</RelativeLayout>
这是源代码 package com.example.myprojects;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.ListView;
public class send_message extends Activity {
private ListView list;
private EditText search;
SimpleCursorAdapter adapterx;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sendmessage);
list=(ListView)findViewById(R.id.list);
search=(EditText)findViewById(R.id.search);
loadfromdatabase();
}
private void loadfromdatabase() {
mydb info=new mydb(this);
info.open_read();
Cursor c = info.getAllData();
String[] columns = new String[] {mydb.KEY_NAME,mydb.KEY_PHONE, mydb.KEY_NICK};
int[] to = new int[] {R.id.name,R.id.phone, R.id.nick };
@SuppressWarnings("deprecation")
SimpleCursorAdapter adapter= new SimpleCursorAdapter(this, R.layout.activity_sendmesage_rows, c, columns, to,0);
list.setAdapter(adapter);
info.close();
}
}
答案 0 :(得分:3)
如果您CheckBox
中有ListView
es,则表示您有问题,因为ListView
重新使用了屏幕上尚未显示的View
。这就是为什么当你向下滚动时,它会加载(几次)你之前检查过的一个CheckBox
。因此,您不能依赖默认的CheckBox
行为。你需要的是:
阻止用户检查CheckBox
。您可以致电cb.setEnabled(false)
来执行此操作,其中cb
为CheckBox
您使用的是SimpleCursorAdapter
。
创建自己的适配器类,扩展list
。在此类中,您将存储已检查项目的getView()
个索引。
覆盖适配器类中的CheckBox
方法,并手动设置OnClickListener
以检查它的位置是否存储在已检查的项目数组中。
为ListView
创建public class MySimpleCursorAdapter extends SimpleCursorAdapter {
public ArrayList<Integer> mItemsChecked;
public MySimpleCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
mItemsChecked = new ArrayList<Integer>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
for(int i = 0; i < mItemsChecked.size(); i++) {
if(mItemsChecked.get(i) == position) {
CheckBox cb = (CheckBox)convertView.findViewById(R.id.checkBox1); // Instead of checkBox1, write your name of CheckBox
cb.setChecked(true);
}
}
return super.getView(position, convertView, parent);
}
/* Just a handy method that will be responsible for adding/removing
items' positions from mItemsChecked list */
public void itemClicked(int position) {
for(int i = 0; i < mItemsChecked.size(); i++) {
if(mItemsChecked.get(i) == position) {
mItemsChecked.remove(i);
return;
}
}
mItemsChecked.add(position);
}
}
,它将负责从适配器的内部数组中添加/删除已检查项目的位置。
修改强>
这将是适配器的代码:
OnItemClickListener
这是ListView
的{{1}}:
final ListView lv = (ListView)findViewById(R.id.listView1); // Your ListView name
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
((MySimpleCursorAdapter)lv.getAdapter()).itemClicked(position);
lv.getAdapter().notifyDataSetChanged(); // Because we need to call getView() method for all visible items in ListView, so that they are updated
}
});
请记得禁用CheckBox
,以便用户无法点击它。
现在您可以将其视为一个小黑客,因为用户根本没有点击CheckBox
- 应用程序将其视为单击特定的ListView
项,然后自动检查相应的{{1}对你而言。
答案 1 :(得分:0)