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();
}
}