2011-11-02 70 views
0

公共類ArrayAdapter時遇到麻煩延伸ArrayAdapter {自定義多種可選的ListView在Android中,滾動

private final List<String> list; 
    private final Activity context; 

    public ArrayAdapter_DiscountList(Activity context, List<Class_Model> list) { 
     super(context, R.layout.list, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView text; 
     protected ToggleButton toggle; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 

     LayoutInflater inflator = context.getLayoutInflater(); 
     view = inflator.inflate(R.layout.list, null); 
     final ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) view.findViewById(R.id.list_item_name);    
     viewHolder.toggle = (ToggleButton) view.findViewById(R.id.checkbox_toggle); 
     viewHolder.toggle.setVisibility(View.VISIBLE); 

     // TODO Auto-generated method stub 
       viewHolder.toggle.setOnCheckedChangeListener(
       new CompoundButton.OnCheckedChangeListener() 
       { 
        @Override 
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
        { 
          String element = (String) viewHolder.toggle.getTag(); 
          element.setSelected(buttonView.isChecked()); 

          if(isChecked) 
          { 
           ArrFDItem.add(list.get(position).getName());  
          }else 
          { 
           ArrFDItem.remove(list.get(position).getName()); 

          } 
        } 
       }); 


     view.setTag(viewHolder); 
     viewHolder.toggle.setTag(list.get(position)); 
     } else { 
     view = convertView; 
     ((ViewHolder) view.getTag()).toggle.setTag(list.get(position)); 
     } 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(list.get(position).getName()); 
     holder.toggle.setChecked(list.get(position).isSelected()); 

     return view; 
    } 

}

工作正常,但scrollng列表視圖時,它的去除列表中的項目,以及與postion of list.get(position).getName();僅獲得0-5(一次只有6個列表項目在列表視圖中可見)。我必須在列表中選擇更多項目,並且必須根據列表中的切換選擇來添加/刪除。請幫忙。感謝你...

回答

0

沒有設備來測試你的代碼(在我的筆記本電腦上),我想說你的問題是由於你如何回收你的視圖。想一想ArrayAdapter#getView()的回收工作情況。也許你需要將convertView == null條件中的一些代碼移到if/else塊的外部?爲了確認這是問題所在,你可以不回收任何東西,並且每次只提供一個新視圖(當然,如果你的列表可能變得非常大,這可能不是有效的,但是對於用足夠大的列表進行測試應該沒問題必須滾動一下)。

希望能幫到現在,明天會有更多的樣子。

編輯:再看看代碼,似乎有一些問題。你的模型的類型究竟是什麼?因爲你的構造函數中有List<Class_Model>(你應該避免在類名中使用下劃線),但是在你的實例變量list中使用List<String>。我很難告訴你想要做什麼,而不知道列表中需要哪一個 - 僅僅是顯示一些文本(在這種情況下,String會這樣做),還是需要更復雜的行爲(在這種情況下你需要一個模型對象)。

以下是一些基於假設的代碼,您需要定義某種類型的ClassModel,並且您的ArrFDItem(無論那是什麼)是局部變量。這兩種假設都可能是錯誤的,但我鼓勵你考慮爲什麼我會做出這些假設......並將你的代碼與下面的代碼進行比較,以查看發生了什麼變化。

public class ArrayAdapterDiscountList extends ArrayAdapter<ClassModel> { 
    protected final List<ClassModel> list; 
    private final Activity context; 
    protected List<String> arrFdItems; 

    public ArrayAdapterDiscountList(Activity context, List<ClassModel> list) { 
     super(context, R.layout.list, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView text; 
     protected ToggleButton toggle; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = null; 
     if (convertView == null) { 

      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.list, null); 
      final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) view.findViewById(R.id.list_item_name); 
      viewHolder.toggle = (ToggleButton) view.findViewById(R.id.checkbox_toggle); 
      viewHolder.toggle.setVisibility(View.VISIBLE); 

      viewHolder.toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        ClassModel element = (ClassModel) viewHolder.toggle.getTag(); 
        element.setSelected(buttonView.isChecked()); 

        if (isChecked) { 
         arrFdItems.add(list.get(position).getName()); 
        } else { 
         arrFdItems.remove(list.get(position).getName()); 
        } 
       } 
      }); 

      view.setTag(viewHolder); 
      viewHolder.toggle.setTag(list.get(position)); 
     } else { 
      view = convertView; 
      ((ViewHolder) view.getTag()).toggle.setTag(list.get(position)); 
     } 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(list.get(position).getName()); 
     holder.toggle.setChecked(list.get(position).isSelected()); 

     return view; 
    } 

    public class ClassModel { 
     private String name; 
     private boolean isSelected; 

     public String getName() { 
      return name; 
     } 

     public boolean isSelected() { 
      return isSelected; 
     } 

     public void setSelected(boolean aBoolean) { 
      isSelected = aBoolean; 
     } 
    } 
} 

如果沒有幫助,你需要回到基礎知識,閱讀一些教程,並試圖按照他們一步一步,直到你得到它的竅門。我可以推薦vogella.de網站上的那些,例如http://www.vogella.de/articles/AndroidListView/article.html

+0

嗨,第一次感謝您的回覆。不知何故,我知道在滾動列表時回收convertview。但無法得到確切的解決方案。請看看問題,我已經退出了。 – Pankaj

+0

嗨aaamos, 感謝您解釋清楚的答案,但我很抱歉,它不適合我。無論如何感謝您的關心,我會通讀您提供的文章。關於ClassModel,它被錯誤地改爲String。這與你解釋的一樣。 再次感謝你.... – Pankaj