一般来说一个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; } }