Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果使用不同的ViewItemType,是否应该使用ViewHolder?_Java_Android_Listview_Android Listview_Android Arrayadapter - Fatal编程技术网

Java 如果使用不同的ViewItemType,是否应该使用ViewHolder?

Java 如果使用不同的ViewItemType,是否应该使用ViewHolder?,java,android,listview,android-listview,android-arrayadapter,Java,Android,Listview,Android Listview,Android Arrayadapter,我最初的问题发布在这里: 但我有点困惑,因为有两个答案被否决了,我想同时使用这两个答案。首先,我认为应该使用getItemViewType方法来帮助我提高性能,这是一个安全的假设。但是,在那之后,我是否仍然应该使用谷歌文档中描述的viewHolder模式 如果我使用ViewHolder代码,我是否将其合并到getView中 static class ViewHolder { TextView text; TextView timestamp; ImageView icon; P

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

但我有点困惑,因为有两个答案被否决了,我想同时使用这两个答案。首先,我认为应该使用
getItemViewType
方法来帮助我提高性能,这是一个安全的假设。但是,在那之后,我是否仍然应该使用谷歌文档中描述的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;
     }
//典型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();
}
}