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

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


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

你可能感兴趣的:(单个listView展示多类型Item出现混乱显示的问题)