zoukankan      html  css  js  c++  java
  • ListView的优化尝试

      在Android开发中,ListView被大量使用,ListView需要的情况多种多样。有时只需要简单的文字列表,有时需要将一个比较复杂的布局作为Item的内容,有时甚至需要不同类型,不同布局的内容交错排布在ListView中。按照通常的ListView优化策略会使用convertView和viewHolder来重用Item提升ListView的效率。但是,这样每一个布局不同的ListView我可能都需要写一个新的Adapter。如果还要在一个ListView中显示不同的布局则可能会产生大量的重复代码。因此,在这里我想换一个思路,暂时还没有经过足够的实践检验,它有可能是错的,我只是在此记录一下思路。

      首先,每个ListView的Adapter真正需要输入的是什么?其实只有两个,一个是布局,一个是数据。Adapter的工作就是连接两者。因此,我希望Adapter中只有连接的内容。布局怎么实现,应该在布局中去写(因为可能有多种布局混在一个ListView中)。

      接下来,数据的类型是未知的,我们只知道它应该是个List,然后List中包含了什么,我们不需要知道,每个布局去List里面找自己需要的东西就好了。

      然后,每个布局都应该有一些公有的,必须实现的方法。比如:加载布局文件、获取布局中的控件、提取数据中的信息更新布局。

      最后,Adapter只需要在getView中告诉布局,你现在去取数据List中第positon个数据来更新布局就可以了。

      下面是代码

      布局类

      BaseAdapterViewHolder:

    public abstract class BaseAdapterViewHolder {
        Context mContext;
        List<?> mDataList;
        View mConvertView;
        public BaseAdapterViewHolder(Context context , List<?> dataList , int convertViewId ){
            mContext = context;
            mDataList = dataList;
            mConvertView = LayoutInflater.from(context).inflate(convertViewId , null);
        }
    public View getConvertView(){
            return mConvertView;
        }
    
        abstract public void getItemChildView(View convertview);
    
        abstract public void setItemChlidView(int position);
    }

       这个类是个虚拟类,在此记当一个子类的实现例子

    public class DoufuItem2Data  extends BaseAdapterViewHolder implements View.OnClickListener {
        ImageView userImage;
        TextView itemState;
        TextView itemUpdateTime;
        int mPositon;
    
        public DoufuItem2Data(Context context, List<?> dataList) {
            super(context, dataList, R.layout.doufu_itemview_test);
        }
    
    
        public void getItemChildView(View mConvertView) {
            userImage = (ImageView) mConvertView.findViewById(R.id.doufu_item_user_image);
            itemState = (TextView) mConvertView.findViewById(R.id.doufu_item_state);
            itemUpdateTime = (TextView) mConvertView.findViewById(R.id.doufu_item_update_time);
        }
    
        public void setItemChlidView(int position) {
            mPositon = position;
            itemState.setText("完结" + mPositon);
            itemUpdateTime.setText("更新 刚刚");
            userImage.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            Toast.makeText(mContext, mDataList.get(mPositon).toString() + mPositon, Toast.LENGTH_SHORT).show();
        }
    }

      最后,附上这个布局类的Adapter中的使用方法:

    public class DoufuFragmentListAdapter extends BaseAdapter {
        private Context mContext;
        private List<?> mDataList;
    
        public DoufuFragmentListAdapter(Context context , List<?> dataList) {
            mContext = context;
            mDataList = dataList;
        }
    
        @Override
        public int getCount() {
            return mDataList.size();
        }
    
        @Override
        public Object getItem(int position) {
            return null;
        }
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            BaseAdapterViewHolder viewHolder;
            if(convertView == null){
                viewHolder = new DoufuItem2Data(mContext , mDataList);
                convertView = viewHolder.getConvertView();
                viewHolder.getItemChildView(convertView);
                convertView.setTag(viewHolder);
            }
            else{
                viewHolder = (DoufuItem2Data) convertView.getTag();
            }
            viewHolder.setItemChlidView(position);
            return convertView;
        }
    
    }

      当我们需要使用不同的布局时,我们只需要将viewHolder = new DoufuItem2Data(mContext , mDataList);换成别的布局类即可。

      Done!

  • 相关阅读:
    Java基础(十四)——API(Calendar类、System类、StringBuilder类、包装类)
    异常
    Java基础(十三)——权限修饰符和内部类
    知识点总结
    Java基础(十二)— —多态
    Java基础(十一)— —继承、抽象类和接口
    java基础(十)——继承
    小程序外部向组件内部传递externalClasses -- 传入样式wxss
    小程序组件交互 -- 传入js
    promise封装小程序的请求类(request,清爽易懂)
  • 原文地址:https://www.cnblogs.com/fishbone-lsy/p/4472048.html
Copyright © 2011-2022 走看看