2013-06-03 21 views
0

我使用BaseAdapter定製我的列表視圖爲什麼BaseAdapter getview將行中的數據混合在一起?

public View getChildView(int groupPosition, int childPosition, 
       boolean isLastChild, View view, ViewGroup parent) { 
      if (view == null) { 
       LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       view = inflater.inflate(R.layout.products_item, null); 
      } 

      FileBean file = (FileBean) ((ExtendedList) (Object) categories.get(groupPosition)).getItem(childPosition); 

      CheckBox checkBox = (CheckBox) view.findViewById(R.id.fileCheckBox); 
      if(checkBox != null){ 
       if(mCheckBoxListener != null){ 
        checkBox.setOnCheckedChangeListener(mCheckBoxListener); 
       } 
       checkBox.setChecked(file.isChecked()); 
       Log.d("getcview", String.valueOf(file.isChecked() + " " + file.getName() 
         + " " + groupPosition + " " + childPosition)); 
      } 

      setProductDetails(file, view); 

      ViewHolder holder = new ViewHolder(); 
      holder.groupPosition = groupPosition; 
      holder.childPosition = childPosition; 
      Log.d("exadapter", "Child " + file.getName()); 

      view.setTag(holder); 
      return view; 
     } 
+0

交更多的代碼。 – njzk2

+0

發佈適配器 – Blackbelt

+0

這是我的代碼 – user1480210

回答

0

覆蓋這兩方法在baseadapter類:

@Override 
    public int getViewTypeCount() { 

     if (getCount() != 0) 
      return getCount(); 

     return 1; 
    } 

    @Override 
    public int getItemViewType(int position) { 

     return position; 
    } 

看看它是否工作。

+0

這是什麼? – user1480210

+0

getViewTypeCount或getChildeTypeCount? – user1480210

0

我看到兩個問題,

1 - 將您LayoutInflater出getView方法,你創建大量垃圾的存在。相反,創建一個實例變量來存儲LayoutInflater,並在適配器的構造函數中創建它。 (這與混音btw沒有關係)。

private LayoutInflater mInflater; //instance variable 

public CustomAdapter(Context context, List<Item> items) { 
    //some code 
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

2 - 你在創建ViewHolder例如每調用getView()。 移動此代碼:

ViewHolder holder = new ViewHolder(); 
holder.groupPosition = groupPosition; 
holder.childPosition = childPosition; 
Log.d("exadapter", "Child " + file.getName()); 
view.setTag(holder); 

裏面的收斂視圖的空檢查。您只想在converView爲空時(僅在新視圖上)創建新的ViewHolder。

public View getChildView(int groupPosition, int childPosition, 
      boolean isLastChild, View view, ViewGroup parent) { 
    //First, get the Tag from the converView 
    ViewHolder mHolder = (ViewHolder) view.getTag(); 
    //Now check if the holder is null, rather than checking if the convertView is null. 
    if (mHolder == null) { 
     //init the holder code 
     view.setTag(mHolder); //only set the Tag if it's a new view. 
    } 

而且,你有幾分使用ViewHolder模式走錯了路,你應該使用ViewHolder來存儲實例的複選框,這樣你就不用調用findViewById(R.id.fileCheckBox);每個getView調用。

希望有所幫助。

+0

更好的適配器優化,但不解決OP問題。 – lukas

+0

我試試這個,但它沒有幫助,我刪除,如果(查看== null)檢查 – user1480210

1

您的問題與滾動列表視圖時回收視圖有關。您必須重新設置每個複選框的正確值(選中或不選)。

你這樣做,但你的訂單是錯誤的,每次你重置複選框checked/not checked值(你先設置監聽器,然後你改變複選框值),你的OnCheckListener被觸發。

  1. 取出OnCheckListener
  2. 選中複選框值
  3. 添加您的聽衆再次

正確的順序:

checkBox.setOnCheckedChangeListener(null); 
checkBox.setChecked(file.isChecked()); 
checkBox.setOnCheckedChangeListener(mCheckBoxListener) 
+0

我這樣做了很多次,它不能防止複選框狀態 – user1480210

+0

我看不到在哪裏看你的適配器。 – lukas