如果我使用不同的ViewItemTypes,我应该使用viewHolders吗?

时间:2014-01-07 20:52:18

标签: java android listview android-listview android-arrayadapter

我最初的问题发布在这里:

ListView for messaging app shows wrong listItem layout after scrolling

但我有点困惑,因为有两个答案被赞成,我想同时使用它们。首先,我认为我应该使用getItemViewType方法来帮助我提高性能,这是一个安全的假设。在那之后,我是否仍应使用Making ListView Scrolling Smooth上的Googles文档中描述的viewHolder模式?

如果我使用ViewHolder代码,我是否将它合并到getView?

static class ViewHolder {
  TextView text;
  TextView timestamp;
  ImageView icon;
  ProgressBar progress;
  int position;
}

static public enum LAYOUT_TYPE {
    INBOUND,
    OUTBOUND
}

@Override
public int getViewTypeCount () {
    return LAYOUT_TYPE.values().length;
}

@Override
public int getItemViewType (int position) {
    if ( messages.get(position).isOutbound())
        return LAYOUT_TYPE.OUTBOUND.ordinal();
    else
        return LAYOUT_TYPE.INBOUND.ordinal();
}

@Override
public View getView (int position, View convertView, ViewGroup parent) {
    LAYOUT_TYPE itemType = LAYOUT_TYPE.values()[getItemViewType(position)];
    ... (code until inflater )
    switch (itemType){
     case INBOUND:
          convertview = /inflate & configure inbound layout
    ViewHolder holder = new ViewHolder();
    holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
    holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
    holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
    holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);
    convertView.setTag(holder);
          break;
     case OUTBOUND:
          convertview = /inflate & configure outbound layout
    ViewHolder holder = new ViewHolder();
    holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);
    holder.text = (TextView) convertView.findViewById(R.id.listitem_text);
    holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);
    holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);
    convertView.setTag(holder);
          break;
     }

1 个答案:

答案 0 :(得分:0)

//典型的getView

public View getView(int position, View containerRow, ViewGroup parent) {

if (containerRow == null) {

    //One time inflate
    containerRow = inflater.inflate(R.layout.yourLayout, parent, false);

    //instantiate all view from layout in levent relevent object.

    //One time instantiation of viewholder
    viewHolder = new ViewHolder();

    viewHolder.someview = viewFromLayou;

    //finally
    containerRow.setTag(viewHolder);
}
else{
    viewHolder = (ViewHolder) containerRow.getTag();
}
}

//在你的情况下它应该是

public View getView(int position, View containerRow, ViewGroup parent) {

if (containerRow == null) {

    //One time inflate
    containerRow = inflater.inflate(R.layout.yourLayout, parent, false);

    //instantiate all view from layout in levent relevent object.

    //One time instantiation of viewholder
    if(inbound)
        inBoundViewHolder = new ViewHolder();
    else            
        outBoundViewHolder = new ViewHolder();

    viewHolder.someview = viewFromLayou;

    //finally
    containerRow.setTag(viewHolder);
}
else{
    viewHolder = (ViewHolder) containerRow.getTag();
}
}