您的位置:首页 > 其它

单个listView展示多类型Item出现混乱显示的问题

2015-11-26 14:59 253 查看
一般来说一个listview 应该展示同一种类型的item,因为系统会对第一页的item缓存下来,这样可以在getView的时候判断view是不是空的,空就创建一个,否则就利用缓存的那个view,创建view的时候可以添加holder,这样的好处就是不用每次都去找子view的id,这样子无论有多少条数据展示的时候也就是缓存一页界面的view,并且最多找到一页界面子view的id。如果不是同一种类型的话,第二页的view拿到的是缓存的view,这样显示就出现相同混乱的情况了。解决的这样的方法我想到:

1.对每个暂时的view都创建,就是不要利用系统帮你缓存的view,实现了效果,坏处就是每个item都要创建,都要找id,很有可能出现切换不流畅的问题,尤其的viewpager里面切换时。

优化:

既然我创建了view,那么我把它缓存下来,这样向上滑动时直接拿缓存缓存的好了,向下滑动时对于新出现的view才创建。

public class RanlListOnClickAdapter extends BaseAdapter{

private List<RankListClickBean> mDatas;
private Context mContext;
private List<View> mViews;//系统不帮我缓存,我自己缓存下来/(ㄒoㄒ)/~~

public RanlListOnClickAdapter(Context context) {
this.mContext = context;
mViews = new ArrayList<>();
}

public void setData(List<RankListClickBean> mDatas){
this.mDatas = mDatas;
}

@Override
public int getCount() {

return (mDatas==null)?0:mDatas.size() ;
}

@Override
public Object getItem(int arg0) {

return mDatas.get(arg0);
}

@Override
public long getItemId(int arg0) {

return arg0;
}

/**
*这个界面坑爹啊,自己坑自己,这样没法利用缓存,只能不断创建,强烈不建议这样做!!!!唯一想到优化的方法
*就是自己缓存下来,列表界面应该尽可能保持一致
*/
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {

View mView = arg1;
int position = arg0;
Holder	mHolder = new Holder();
Boolean isTag = mDatas.get(position).getIsTag();
if(position == mViews.size()){
if(isTag) {
mView = LinearLayout.inflate(mContext, R.layout.adapter_ranklist_click_tag, null);
mHolder.TagText = (TextView) mView.findViewById(R.id.adapter_ranklist_click_tag_text);

}else{

mView = LinearLayout.inflate(mContext, R.layout.adapter_ranklist_item, null);
mHolder.title = (TextView) mView.findViewById(R.id.adapter_ranklist_item_title);
mHolder.uploadername = (TextView) mView.findViewById(R.id.adapter_ranklist_item_uploadname);
mHolder.clicknums = (TextView) mView.findViewById(R.id.adapter_ranklist_item_clicknums);
mHolder.number = (TextView) mView.findViewById(R.id.adapter_ranklist_item_num);
}
mView.setTag(mHolder);
mViews.add(mView);
}
else{
mView = mViews.get(position);
mHolder = (Holder) mView.getTag();
}

if(isTag){
String tagtext = mDatas.get(position).getRankType();
mHolder.TagText.setText(tagtext);

} else{
ClickBean clickbean = mDatas.get(position).getmDataBean();
String title = clickbean.getName();
String uploadername = clickbean.getCategory();
String cliclnums = clickbean.getClickNumber();
String number = mDatas.get(position).getNumber();

mHolder.title.setText(title);
mHolder.uploadername.setText(uploadername);
mHolder.clicknums.setText(judegNull(cliclnums));
mHolder.number.setText(number);
}

return mView;
}

private String judegNull(String clicknum){
if(clicknum==null||clicknum.trim().equals(""))
return "0";
return clicknum;
}

private class Holder{
public TextView title;
public TextView uploadername;
public TextView clicknums;
public TextView number;
public TextView TagText;
}

}


这样子性能就改善了不少了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: