2013-07-05 105 views
2

我有一個listview的麻煩。我添加了一個複選框到列表視圖中來選擇項目。我的數據來自sqlite,所以我使用簡單的遊標適配器。我的名單長度是250行。我點擊一個複選框。當我向下滾動頁面(列表)時,每10行點擊一次複選框(例如,在我的屏幕顯示10行數據,當我滾動第11行時,該行的複選框已經點擊了。這個問題listview checkbox麻煩在android

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

} 
+0

編寫自定義適配器和getView做處理()的自定義適配器的方法與觀點 – Cris

+0

你大概位置屬性的幫助需要創建一個自定義列表適配器。列表適配器將在可能的情況下重用行視圖,因此複選框的狀態是不確定的,並且取決於要重用的視圖。您的數據不會初始化複選框,因此目前沒有任何內容。自定義適配器將允許您初始化您的複選框。 –

+0

thanx您的關注我會嘗試 –

回答

3

如果您在ListViewCheckBox ES你有問題,因爲ListView重用View S中的不已經可以在屏幕上看到,這就是爲什麼當你向下滾動時,它會加載(幾次),一個CheckBox這是你以前檢查。所以你不能依靠默認的CheckBox的行爲。你需要的是:

  1. 防止用戶檢查CheckBox。您可以通過撥打cb.setEnabled(false)來完成此操作,其中cbCheckBox您正在使用。

  2. 創建您自己的適配器類,它將擴展SimpleCursorAdapter。在這個課程中,您將存儲list被檢查項目的索引。

  3. 覆蓋getView()方法在您的適配器類和手動設置CheckBox要檢查,如果它的位置存儲在檢查項目數組中。

  4. 爲您的ListView創建OnClickListener,這將負責添加/刪除適配器內部陣列中已檢查項目的位置。

編輯:

這將是您的適配器的代碼:

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); 
    } 
} 

這是OnItemClickListenerListView

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

+0

thanx piotr我會嘗試,我會寫結果,如果我:) –

+0

@Fahri_D沒問題,我已經添加了一些代碼,如果你需要它。 –

+0

thnx so muchci會看起來。我正在閱讀此頁面。也許它會幫助某人http://lalit3686.blogspot.com/2012/06/today-i-am-going-to-show-how-to-deal.html –