2013-09-26 82 views
0

我有文本和複選框的列表視圖。滾動列表視圖時,複選框的行爲很奇怪。這似乎是一個回收問題。無論如何,我嘗試了一些類似的帖子中提出的各種選項,但他們都沒有爲我工作。我嘗試設置並獲得其中一個帖子中建議的標籤位置,但運氣不佳。我在列表視圖的活動文件中使用自定義適配器。以下是一些代碼片段; Activity類:ListView滾動複選框問題

lv = (ListView) findViewById(R.id.itemdisplay_listview); 
lv.setAdapter(new CustomAdapter(this, itemNames, tableNo)); 

自定義適配器:

private class CustomAdapter extends BaseAdapter { 

     private List<String> mListItems; 
     private LayoutInflater mLayoutInflater; 
     ViewHolder holder; 
     int a = 1; 

     public CustomAdapter(Context context, List<String> arrayList, 
       String table) { 
      tableNumber = table; 
      mListItems = arrayList; 

      // get the layout inflater 
      mLayoutInflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return mListItems.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public long getItemId(int arg0) { 
      // TODO Auto-generated method stub 
      return 0; 
     } 

     private class ViewHolder { 

      TextView itemName, quantity; 
      CheckBox checkbox; 
      ImageButton addBtn, minusBtn; 

     } 

     @Override 
     public View getView(int position, View convertview, ViewGroup viewGroup) { 

      // create a ViewHolder reference 

      // check to see if the reused view is null or not, if is not null 
      // then 
      // reuse it 
      if (convertview == null) { 
       holder = new ViewHolder(); 

       convertview = mLayoutInflater.inflate(
         R.layout.itemdisplay_list, null); 

       holder.itemName = (TextView) convertview 
         .findViewById(R.id.itemdisplaylist_name); 
       holder.addBtn = (ImageButton) convertview 
         .findViewById(R.id.itemdisplaylist_add); 
       holder.minusBtn = (ImageButton) convertview 
         .findViewById(R.id.itemdisplaylist_minus); 
       holder.quantity = (TextView) convertview 
         .findViewById(R.id.itemdisplaylist_quantity); 
       holder.checkbox = (CheckBox) convertview 
         .findViewById(R.id.itemdisplaylist_cbox); 

       // holder.checkbox.setTag(position); 


       // the setTag is used to store the data within this view 
       convertview.setTag(holder); 
      } else { 
       // the getTag returns the viewHolder object set as a tag to the 
       // view 
       holder = (ViewHolder) convertview.getTag(); 
      } 

      holder.checkbox.setOnClickListener(checkListener); 
      doneBtn.setEnabled(true); 

      holder.minusBtn.setImageResource(R.drawable.minus); 
      holder.quantity.setText(String.valueOf(a)); 
      holder.addBtn.setImageResource(R.drawable.add); 
      holder.addBtn.setOnClickListener(addBtnClick); 
      holder.minusBtn.setOnClickListener(minusBtnClick); 

      String stringItem = mListItems.get(position); 

      if (stringItem != null) { 
       if (holder.itemName != null) { 
        // set the item name on the TextView 
        holder.itemName.setText(stringItem); 
       } 
      } 

      // this method must return the view corresponding to the data at the 
      // specified position. 
      return convertview; 

     } 

     private OnClickListener checkListener = new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       /*doneBtn.setOnClickListener(doneBtnClick);*/ 
       View view = (View) v.getParent(); 

       CheckBox cb = (CheckBox) view 
         .findViewById(R.id.itemdisplaylist_cbox); 
       TextView tv = (TextView) view 
         .findViewById(R.id.itemdisplaylist_name); 
       TextView tv1 = (TextView) view 
         .findViewById(R.id.itemdisplaylist_quantity); 
       if (cb.isChecked()) { 
        map.put(tv.getText().toString(), tv1.getText().toString()); 
       } else { 
        for (Iterator<Map.Entry<String, String>> it = map 
          .entrySet().iterator(); it.hasNext();) { 

         Map.Entry<String, String> entry = it.next(); 
         String item = entry.getKey(); 
         if ((tv.getText().toString()).equals(item)) { 
          it.remove(); 
         } 
        } 
       } 

      } 
     }; 

我一直在掙扎了很長一段時間。請指教。謝謝。

+0

看看我的答案。 – Harshid

回答

0

將一個boolean checked變量添加到ViewHolder。將其更改爲checkListener。然後在getViewholder.checkbox.setChecked(holder.checked)

希望它有幫助。

+0

謝謝。我嘗試了建議,但仍然是同樣的問題。現在嘗試其他選項。 – Gaurav

+0

只需製作一個新的arrayList,其中包含您選中的複選框位置。將其傳遞到適配器並在適配器中修改arraylist和用戶holder.checkbox.setOncheckChangeListener(){}。在這裏寫你的邏輯來修改數組列表。 – newBie

0

你將需要有某種形式的模型對象,其保留您的複選框的狀態,然後使用該模型,而不是一個簡單的字符串作爲你的數據結構:

// Oversimplified, but adiquate for our purposes. 
public class ItemModel 
{ 
    public String text; 
    public boolean isChecked; 
} 

然後,強似一串字符串到適配器,傳遞一個ItemModels的數組。 您需要的字符串將是文本參數,然後您必須將複選框值設置爲isChecked值。

一旦複選框狀態發生變化,剩下的就是更改isChecked值。 在初始化holder.checkbox參數後,在if(convertView == null)塊內的getItem方法內執行此操作。另外,請確保在方法參數final中使position變量。

下面的代碼:

holder.checkbox.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() 
     {   
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
      { 
       mListItems.get(position).isChecked = isChecked; 

      } 
     }); 

希望這有助於:)

0

我的猜測是你所得到的回收問題咬傷。
我建議你刪除偵聽器首先使用else語句

holder.checkbox.setOnCheckedChangeListener(null); 

在您的代碼如下如下:

} else { 
       // the getTag returns the viewHolder object set as a tag to the 
       // view 
       holder = (ViewHolder) convertview.getTag(); 
       holder.checkbox.setOnCheckedChangeListener(null); 
      } 
+0

謝謝。嘗試建議,但仍然是同樣的問題。 – Gaurav

1

如果說數據100個轉債,那麼你還需要存儲他們的checked/unchecked state。可以說一個100個元素的布爾數組CheckedStatus [100]。在GetView做

if(CheckedStatus[position] == true) { 
// check the check box 
} else { 
// uncheck it 
}. 

位置是在自定義列表視圖適配器調用調用setOnCheckedChangeListener。這種方式後setChecked在GetView功能

1

收到一個你切斷鏈接來自回收視圖的老聽衆。