2

我在使用 listview 时遇到了问题。我在列表视图中添加了一个复选框来选择项目。我的数据来自 sqlite,所以我使用简单的光标适配器。我列表的长度是 aproximatley 250 行。我正在单击一个复选框。当我向下滚动页面(列表)时,每 10 行单击一次复选框。(例如,当我滚动第 11 行时,在我的屏幕上显示 10 行数据,该行的复选框已单击。我该如何解决这个问题。

<?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>

这是源代码包 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();
    }

 }
4

2 回答 2

3

如果你有CheckBoxesListView你有问题,因为ListView重用View了屏幕上不可见的 s。这就是为什么当您向下滚动时,它会加载(几次)CheckBox您之前检查过的那个。所以你不能依赖 defaultCheckBox的行为。你需要的是:

  1. 防止用户检查CheckBox。你可以通过调用来做到这一点,你cb.setEnabled(false)在哪里使用。cbCheckBox

  2. 创建您自己的将扩展的适配器类SimpleCursorAdapter。在本课程中,您将存储list已检查项目的索引。

  3. 覆盖getView()您的适配器类中的方法,CheckBox如果它的位置存储在已检查项目数组中,则手动设置为进行检查。

  4. 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

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项目,这反过来会自动检查适合CheckBox您的情况。

于 2013-07-05T12:48:51.053 回答
0

这是一个简单的示例,可以帮助您实现该场景

http://www.mysamplecode.com/2012/07/android-listview-checkbox-example.html

于 2013-07-05T13:01:50.237 回答