listview复选框麻烦在android中

时间:2013-07-05 12:38:43

标签: android android-listview android-checkbox

我在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();
    }

 }

2 个答案:

答案 0 :(得分:3)

如果您CheckBox中有ListView es,则表示您有问题,因为ListView重新使用了屏幕上尚未显示的View。这就是为什么当你向下滚动时,它会加载(几次)你之前检查过的一个CheckBox。因此,您不能依赖默认的CheckBox行为。你需要的是:

  1. 阻止用户检查CheckBox。您可以致电cb.setEnabled(false)来执行此操作,其中cbCheckBox您使用的是SimpleCursorAdapter

  2. 创建自己的适配器类,扩展list。在此类中,您将存储已检查项目的getView()个索引。

  3. 覆盖适配器类中的CheckBox方法,并手动设置OnClickListener以检查它的位置是否存储在已检查的项目数组中。

  4. 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); } } ,它将负责从适配器的内部数组中添加/删除已检查项目的位置。

  5. 修改

    这将是适配器的代码:

    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)

以下是帮助您实现该方案的简单示例

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