2016-01-23 66 views
1

描述錯誤的回收行爲:的ListView - 與ViewHolder設計


我目前正在實施定製ListViewAdapter使用ViewHolder設計模式。適配器正在使用具有切換RelativeLayout可見性的按鈕的佈局。

問題:


當我點擊按鈕,RelativeLayout的顯示,一切似乎直到我向下滾動,做工精細。 當我向下滾動時,我看到其他列表項已被前一個按鈕單擊所影響,所以RelativeLayout在其他(錯誤)項目上可見。受按鈕點擊影響的項目似乎是向下滾動時回收的項目。請注意,其他一切正常,文本等被設置在正確的位置。

代碼:


CustomListAdapter

public class ItemsListAdapter extends ArrayAdapter<Item> { 
private Context mContext; 
private List<Item> mItems; 

public ItemsListAdapter(Context context, int resource, List<Item> objects) { 
    super(context, resource); 
    mContext = context; 
    mItems = objects; 
} 

static class ViewHolder { 
    View mView; 
    boolean mExpanded; 

    public ViewHolder(View view, boolean expanded) 
    { 
     mView = view; 
     mExpanded = expanded; 
    } 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    final Item item = getItem(position); 

    final ViewHolder holder; 
    if (v == null) { 

     LayoutInflater mInflater = (LayoutInflater) 
       mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     v = mInflater.inflate(R.layout.custom_list_item, null); 

     holder = new ViewHolder(v, false); 
     v.setTag(holder); 
    } else { 
     holder = (ViewHolder) v.getTag(); 
    } 

    if(item != null) 
    { 
     TextView tvName = (TextView) holder.mView.findViewById(R.id.tv_name); 
     tvName.setText(item.getName()); 

     RelativeLayout rlExpand = (RelativeLayout) holder.mView.findViewById(R.id.rl_expand); 
     if(holder.mExpanded) { 
      rlExpand.setVisibility(View.VISIBLE); 
     } 
     else { 
      rlExpand.setVisibility(View.GONE); 
     } 

     TextView tvDescription = (TextView) holder.mView.findViewById(R.id.tv_description); 
     if(tvDescription != null) 
      tvDescription.setText(item.getDescription()); 

     final ImageButton ibExpand = (ImageButton) holder.mView.findViewById(R.id.ib_expand); 
     ibExpand.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       RelativeLayout rlExpand = (RelativeLayout) holder.mView.findViewById(R.id.rl_expand); 
       if (rlExpand.getVisibility() == View.GONE) { 
        v.setVisibility(View.INVISIBLE); 
        rlExpand.setVisibility(View.VISIBLE); 
        holder.mExpanded = true; 
       } 
      } 
     }); 

     ImageButton ibCollapse = (ImageButton) holder.mView.findViewById(R.id.ib_collapse); 
     ibCollapse.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       RelativeLayout rlExpand = (RelativeLayout) holder.mView.findViewById(R.id.rl_expand); 
       ibExpand.setVisibility(View.VISIBLE); 
       rlExpand.setVisibility(View.GONE); 
       holder.mExpanded = false; 
      } 
     }); 


    } 

    return v; 
} 

@Override 
public int getCount() { 
    return mItems.size(); 
} 

@Override 
public Truism getItem(int position) { 
    return mItems.get(position); 
} 

任何幫助,不勝感激!先謝謝你!

+0

保存您的視圖狀態到模型如isExpanded。 –

+0

Sopmething與您的代碼完全錯誤:Item和ViewHolder之間的關係是什麼? – barmaley

回答

1

嘗試改變:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    final Item item = getItem(position); 

    final ViewHolder holder; 
    if (v == null) { 

     LayoutInflater mInflater = (LayoutInflater) 
       mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     v = mInflater.inflate(R.layout.custom_list_item, null); 

     holder = new ViewHolder(v, false); 
     v.setTag(holder); 
    } else { 
     holder = (ViewHolder) v.getTag(); 
    } 

    if(item != null) 
    { 
     TextView tvName = (TextView) holder.mView.findViewById(R.id.tv_name); 
     tvName.setText(item.getName()); 

     RelativeLayout rlExpand = (RelativeLayout) holder.mView.findViewById(R.id.rl_expand); 
     if(item.isExpanded) { 
      rlExpand.setVisibility(View.VISIBLE); 
     } 
     else { 
      rlExpand.setVisibility(View.GONE); 
     } 

     TextView tvDescription = (TextView) holder.mView.findViewById(R.id.tv_description); 
     if(tvDescription != null) 
      tvDescription.setText(item.getDescription()); 

     [...] 
    } 

    return v; 
} 

變化holder.mExpandeditem.isExpanded

+0

非常感謝,這有所幫助。 – Al0x