3

我知道這個問題已被問過,但我有一個旋轉,我似乎無法找到一個優雅的解決方案。列表視圖與自定義可檢查行支持自定義遊標適配器丟失選擇當回收視圖

如何在列表視圖中跟蹤選定的複選框,該列表視圖使用自定義可檢查的相對佈局(其中包含複選框和其他文本視圖),該自定義光標適配器可以根據用戶點擊的內容更改大小篩選用戶選擇)。

我有我的listview活動,它使用一個自定義的遊標適配器(有適當的覆蓋bindview和newview函數以及viewHolder類來利用視圖回收)。

當用戶單擊行項目時,該列表將被過濾,並且loadmanager將重新啓動以顯示新的過濾列表。這意味着我的列表視圖大小不斷變化。另外,我試圖實現整個複選框onclicklistener覆蓋的事情,隨着設置和獲取標籤,但無論我在我的bindview()方法做的複選框不檢查(可能這是因爲他們在一個可檢查的行內) 。另外,我對getview(或我的例子中的bindview方法)中的整個複選框onclicklistener覆蓋感到困惑,以及我看到的很多解決方案沒有不斷更改大小的列表視圖。

任何幫助將不勝感激。

這是我的自定義遊標適配器類。

public class TaskListViewAdapter extends CursorAdapter { 

    private LayoutInflater mLayoutInflater; 

    public TaskListViewAdapter(Context context, Cursor c, int flags) { 
     super(context, c, flags); 

     mLayoutInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 

     ViewHolder holder = (ViewHolder) view.getTag(); 
     int nTaskStatus; 
     int nTaskType; 
     int nSuite; 
     String nTaskServiceTextColor; 
     String nTaskServiceBackgroundColor; 
     String nSuiteValue; 

     if (holder == null) 
     { 
      // Creates a ViewHolder and store references to the children views we want to bind data to. 
      holder = new ViewHolder(); 

      holder.taskScreenCheckBox = (CheckBox) view.findViewById(R.id.taskScreenCheckBox); 
      holder.taskScreenRowText11 = (TextView) view.findViewById(R.id.taskScreenRowText11); 

      view.setTag(holder); 
     } 

     // Getting the data from the cursor and setting the row elements appropriately 
     if (cursor != null) { 


      holder.taskScreenRowText11.setText(cursor.getString(cursor.getColumnIndex(DatabaseAdapter.KEY_TASKS_NUMEROAPPEL))); 

     } 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     final View view = mLayoutInflater.inflate(R.layout.task_screen_row, parent, false); 
     return view; 
    } 

    /** 
    * 
    * 
    *   A viewholder that stores each component of the task_screen_row view. 
    * 
    */ 
    static class ViewHolder { 
     CheckBox taskScreenCheckBox; 
     TextView taskScreenRowText11; 

    } 
} 

這裏是我的自定義可選中排佈局:

package com.courrierplus.mobi; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.CheckBox; 
import android.widget.Checkable; 
import android.widget.RelativeLayout; 

public class CheckableRelativeLayout extends RelativeLayout implements Checkable { 

    private CheckBox mCheckbox; 

    public CheckableRelativeLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean isChecked() { 
     return mCheckbox.isChecked(); 
    } 

    @Override 
    public void setChecked(boolean isChecked) { 
     mCheckbox.setChecked(isChecked); 
    } 

    @Override 
    public void toggle() { 
     mCheckbox.toggle(); 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 

     final int childCount = this.getChildCount(); 
     for (int i = 0; i < childCount; ++i) { 

      View v = getChildAt(i); 
      if (v instanceof CheckBox) { 
       mCheckbox = (CheckBox) v; 
      } 
     } 
    } 
} 

在我ListViewActivity上一個行的用戶點擊後,onListItemClick函數被調用,然後調用我的自定義適配器的NewView的代碼膨脹我自定義可選行並檢查其中的複選框。

我的問題是,當我得到複選框並手動嘗試將其設置爲檢查它不起作用時,我的自定義適配器bindView內。另外,我不確定如何跟蹤已檢查或未檢查的內容。

回答