2

i have a trouble with listview. i added a checkbox into listview to choose items. my data is coming from sqlite so i use simple cursor adapter. length of my list is aproximatley 250 lines. i am clicking a check box.when i scroll down page (list), checkbox is clicked in every 10 lines.(for example in my screen show 10 lines data when i scroll 11th lines, this row's checkbox had clicked. how can i solve this problem.

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

and this is source code 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();
    }

 }
4

2 に答える 2

3

CheckBoxにes がある場合は、まだ画面に表示されていない s を再利用するListViewため、問題があります。そのため、下にスクロールすると、以前にチェックしたものが (数回) 読み込まれます。したがって、 default の動作に依存することはできません。必要なものは次のとおりです。ListViewViewCheckBoxCheckBox

  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 に答える