2013-03-03 28 views
0

我試過讓列表視圖有TextViewCheckBox。它工作的很好,但是在另一行中選擇CheckBox行另一個CheckBox也被選中。 例如:如果我檢查第一行並向下滾動,我發現另一行也被選中。列表視圖中的CheckBox問題對於行的不同佈局

我的適配器代碼

public class ReadersrListAdapter extends BaseAdapter{ 
private static final int TYPE_SEPARATOR = 0; 
private static final int TYPE_ITEM = 1; 
private static final int TYPE_MAX_COUNT = 2; 
private Activity activity; 
private ArrayList<HashMap<String, String>> data; 
private LayoutInflater mInflater=null; 



public ReadersrListAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
    activity = a; 
    data=d; 
    mInflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

public int getCount() { 
    return data.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

@Override 
public boolean areAllItemsEnabled() { 
    return false; 
} 

@Override 
public boolean isEnabled(int position) { 
    return !data.get(position).get(UtiliShare.KEY_TITLE).startsWith("-"); 
} 

@Override 
public int getItemViewType(int position) { 
    return data.get(position).get(UtiliShare.KEY_TITLE).startsWith("-") ? TYPE_SEPARATOR : TYPE_ITEM; 
} 

@Override 
public int getViewTypeCount() { 
    return TYPE_MAX_COUNT; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null;   
    ViewHolder2 holder2 = null; 
    int type = getItemViewType(position); 

    if (convertView == null) { 
     //holder = new ViewHolder(); 
     switch (type) { 
      case TYPE_ITEM: 
       holder = new ViewHolder(); 
       convertView = mInflater.inflate(R.layout.reader_list_item, null); 
       holder.textView = (TextView)convertView.findViewById(R.id.readerTitle); 
       holder.textView.setTypeface(UtiliShare.getTf()); 
       convertView.setTag(holder); 
       break; 
      case TYPE_SEPARATOR: 
       holder2 = new ViewHolder2(); 
       convertView = mInflater.inflate(R.layout.reader_list_devider, null); 
       holder2.textView = (TextView)convertView.findViewById(R.id.readerTitle); 
       holder2.textView.setTypeface(UtiliShare.getTf()); 
       convertView.setTag(holder2); 
       break; 
     } 
     //convertView.setTag(holder); 
    } else { 
     if(type==TYPE_ITEM) holder = (ViewHolder)convertView.getTag(); 
     else holder2 = (ViewHolder2)convertView.getTag(); 
    } 
    HashMap<String, String> curdata = new HashMap<String, String>(); 
    curdata = data.get(position); 
    String txt = curdata.get(UtiliShare.KEY_TITLE); 
    if(type == TYPE_SEPARATOR){ 
     txt = txt.replace("-", ""); 
     holder2.textView.setText(txt); 
    }else{ 
     //if(position <= 100) System.out.println("getView " + position + " " + convertView + " type = " + type); 
     holder.star = (CheckBox) convertView.findViewById(R.id.btn_Fav); 
     holder.star.setOnCheckedChangeListener(((ReadersListActivity) this.activity).mStarCheckedChanceChangeListener); 

     holder.textView.setText(txt); 
    } 
    //holder.textView.setText(txt); 
    return convertView; 
} 



private static class ViewHolder { 
    public CheckBox star; 
    public TextView textView; 
} 

private static class ViewHolder2 { 
    public TextView textView; 
} 

}

OnCheckedChangeListener在活動

public OnCheckedChangeListener mStarCheckedChanceChangeListener = new OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     // TODO Cyril: Not implemented yet! 
      final int position = list.getPositionForView(buttonView); 
      Toast.makeText(ReadersListActivity.this, ""+position, Toast.LENGTH_SHORT).show(); 
     } 
    }; 

我怎樣才能解決這個問題???

謝謝。

回答

0

正如您所知,佈局在您滾動時會重複使用,因此您需要跟蹤每行是否應該自行檢查。讓我們一個新的成員添加到您的適配器:

private SparseBooleanArray checked = new SparseBooleanArray(); 

和新方法:

public void toggleCheck(int position) { 
    boolean state = expanded.get(position, false); 
    expanded.put(!state); 
} 

現在撥打我們的新方法onCheckedChanged()

final int position = list.getPositionForView(buttonView); 
adapter.toggleCheck(position); 

最後,讓我們調整getView()改變檢查狀態(和其他一些事情):

// Don't create a new HashMap that you'll never use 
//HashMap<String, String> curdata = new HashMap<String, String>(); 

HashMap<String, String> curdata = data.get(position); 
String txt = curdata.get(UtiliShare.KEY_TITLE); 
if(type == TYPE_SEPARATOR){ 
    txt = txt.replace("-", ""); 
    holder2.textView.setText(txt); 
}else{ 
    //if(position <= 100) System.out.println("getView " + position + " " + convertView + " type = " + type); 

    // These two lines should be in `if(convertView == null)` with the others 
    holder.star = (CheckBox) convertView.findViewById(R.id.btn_Fav); 
    holder.star.setOnCheckedChangeListener(((ReadersListActivity) this.activity).mStarCheckedChanceChangeListener); 

    // Set the appropriate values 
    holder.textView.setText(txt); 
    holder.star.setChecked(expanded.get(position, false)); 
} 
+0

什麼是'expanded'? – AwadKab 2013-03-03 18:03:00