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

来源:互联网 发布:传奇盗取管理权限软件 编辑:程序博客网 时间:2024/06/02 03:21

  一般来说一个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;}@Overridepublic int getCount() {return (mDatas==null)?0:mDatas.size() ;}@Overridepublic Object getItem(int arg0) {return mDatas.get(arg0);}@Overridepublic long getItemId(int arg0) {return arg0;}/** *这个界面坑爹啊,自己坑自己,这样没法利用缓存,只能不断创建,强烈不建议这样做!!!!唯一想到优化的方法 *就是自己缓存下来,列表界面应该尽可能保持一致 */@Overridepublic View getView(int arg0, View arg1, ViewGroup arg2) {View mView = arg1;int position = arg0;HoldermHolder = 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;}}


这样子性能就改善了不少了。

0 0
原创粉丝点击