Android 之万能BaseAdapter是时候来了,为ListView量身打造

导读:本篇文章讲解 Android 之万能BaseAdapter是时候来了,为ListView量身打造,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言:从此我们告别了一个listView 一个adapter的年代

  1. 第一步:定义抽象的CommonAdapter类
    /**
    • 下面看如何打造一个通过的Adapter,我们叫做CommonAdapter
    • 继续分析,Adapter一般需要保持一个List对象,存储一个Bean的集合,
    • 不同的ListView,Bean肯定是不同的,这个CommonAdapter肯定需要支持泛型,
    • 内部维持一个List,就解决我们的问题了;
    • @author Administrator 易皇星 2016.03.10
    • @param list数据泛型
      */
public  abstract class CommonAdapter<T> extends BaseAdapter {
     protected LayoutInflater mInflater;  
     protected Context mContext;  
     protected List<T> mDatas;  
     protected final int mItemLayoutId;  

/**
 *   //构造方法一次搞定传参
 * @param context  上下文
 * @param mDatas   list数据集合  
 * @param mItemLayoutId      Adapter需要的布局文件
 */
    public CommonAdapter(Context context, List<T> mDatas,int mItemLayoutId) {
         mInflater = LayoutInflater.from(context);  
         this.mContext = context; 
         this.mDatas = mDatas;  
         this.mItemLayoutId = mItemLayoutId;  

        }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
         return mDatas.size();  
    }

    @Override
    public T getItem(int position) {
        // TODO Auto-generated method stub
          return mDatas.get(position);  
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
         return position;  
    }

     @Override  
        public View getView(int position, View convertView, ViewGroup parent){  
            final ViewHolder viewHolder = getViewHolder(position, convertView, parent);  
            //最好的回调
            convert(viewHolder, getItem(position));  
            return viewHolder.getConvertView();  

        }  


        private ViewHolder getViewHolder(int position, View convertView, ViewGroup parent) {  
            return ViewHolder.get(mContext, convertView, parent, mItemLayoutId,position);  
        }  
/**
 * 对外公布了一个convert方法,并且还把viewHolder和本Item对于的Bean对象给传出去,
 * 现在convert方法里面需要干嘛呢?
 * 通过ViewHolder把View找到,通过Item设置值;
 * 现在我觉得代码简化到这样,我已经不需要单独写一个Adapter了,直接MainActivity匿名内部类走起
 *  
 * @param helper
 * @param item
 */

        public abstract void convert(ViewHolder viewHolder, T object);  


}
  1. 第二步:抽离出ViewHolder
public class ViewHolder {
    private final SparseArray<View> mViews;
    private Context mContext;
    private View mConvertView;
    // 构造方法
    private ViewHolder(Context context, ViewGroup parent, int layoutId,
            int position) {
        this.mContext=context;
        this.mViews = new SparseArray<View>();
        mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
                false);
        // setTag
        mConvertView.setTag(this);

//      //配置ImageLoader两种发方法   1 可以在自己的MyApplication的oncrate()方法中配置
//                                    2.在此构造方法中配置
//       //创建默认的ImageLoader配置参数    
//        ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(context); 
//        ImageLoader.getInstance().init(configuration); 
    }

    /**
     * 拿到一个ViewHolder对象 对CommonAdapter提供一个暴漏的方法
     * 
     * @param context
     * @param convertView
     * @param parent
     * @param layoutId
     * @param position
     * @return
     */

    public static ViewHolder get(Context context, View convertView,
            ViewGroup parent, int layoutId, int position) {
        if (convertView == null) {
            return new ViewHolder(context, parent, layoutId, position);
        }
        return (ViewHolder) convertView.getTag();
    }


    public View getConvertView() {
        return mConvertView;
    }

    /**
     * 通过控件的Id获取对于的控件,如果没有则加入views
     * 
     * @param viewId
     * @return
     */
    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }

    /**
     * 为TextView设置字符串
     * 
     * @param viewId
     * @param text
     * @return
     */
    public ViewHolder setText(int viewId, String text) {
        TextView view = getView(viewId);
        view.setText(text);
        return this;
    }
/**
 *  为TextView 设置字体颜色    
 * @param viewId
 * @param textColor
 * @return
 */

    public ViewHolder setTextColor(int viewId, int textColor)
    {
        TextView view = getView(viewId);
        view.setTextColor(textColor);
        return this;
    }
/**
 *  同上
 * @param viewId
 * @param textColorRes
 * @return
 */
    public ViewHolder setTextColorRes(int viewId, int textColorRes)
    {
        TextView view = getView(viewId);
        view.setTextColor(mContext.getResources().getColor(textColorRes));
        return this;
    }



    /**
     * 为ImageView设置图片
     * 获取本地资源图片
     * @param viewId     
     * @param drawableId
     * @return
     */
    public ViewHolder setImageResource(int viewId, int drawableId) {
        ImageView view = getView(viewId);
        view.setImageResource(drawableId);

        return this;
    }

    /**
     * 为ImageView设置图片
     *  Bitmp格式
     * @param viewId
     * @param drawableId
     * @return
     */
    public ViewHolder setImageBitmap(int viewId, Bitmap bm) {
        ImageView view = getView(viewId);
        view.setImageBitmap(bm);
        return this;
    }

    /**
     * 为ImageView设置图片
     *  网络加载图片调用
     * @param viewId
     * @param drawableId
     * @return
     */
    public ViewHolder setImageByUrl(String url,int  viewId) {
        ImageLoader.getInstance().displayImage(url, (ImageView)getView(viewId),ImageOptions.Options());
        return this;
    }
/**
 * Drawable 类型图片
 * 
 * @param viewId
 * @param drawable
 * @return
 */

    public ViewHolder setImageDrawable(int viewId, Drawable drawable)
    {
        ImageView view = getView(viewId);
        view.setImageDrawable(drawable);
        return this;
    }
/**
 *  设置背景颜色
 * @param viewId
 * @param color
 * @return
 */
    public ViewHolder setBackgroundColor(int viewId, int color)
    {
        View view = getView(viewId);
        view.setBackgroundColor(color);
        return this;
    }   

/**
 *      本地资源
 * @param viewId
 * @param backgroundRes
 * @return
 */
    public ViewHolder setBackgroundRes(int viewId, int backgroundRes)
    {
        View view = getView(viewId);
        view.setBackgroundResource(backgroundRes);
        return this;
    }


/**
 * 为控件设置是否可点击
 * @param viewId
 * @param checked
 * @return
 */
    public ViewHolder setChecked(int viewId, boolean checked)
    {
        Checkable view = (Checkable) getView(viewId);
        view.setChecked(checked);
        return this;
    }

    /**
     * 关于事件的
     */
    public ViewHolder setOnClickListener(int viewId,
            View.OnClickListener listener)
    {
        View view = getView(viewId);
        view.setOnClickListener(listener);
        return this;
    }

}
  1. 调用:
public class MainActivity extends Activity {

    private ListView lv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv=(ListView) findViewById(R.id.lv_main);

        List<PersionInfo> mDatas=new ArrayList<PersionInfo>();
        PersionInfo info=new PersionInfo("https://img-my.csdn.net/uploads/201309/01/1378037235_3453.jpg", "易皇星1");   
        PersionInfo info2=new PersionInfo("https://img-my.csdn.net/uploads/201309/01/1378037235_3453.jpg", "易皇星2");  
        PersionInfo info3=new PersionInfo("https://img-my.csdn.net/uploads/201309/01/1378037235_3453.jpg", "易皇星3");  
        PersionInfo info4=new PersionInfo("https://img-my.csdn.net/uploads/201309/01/1378037235_3453.jpg", "易皇星4");  
        mDatas.add(info);
        mDatas.add(info2);
        mDatas.add(info3);
        mDatas.add(info4);


        CommonAdapter<PersionInfo> myAdapter=new CommonAdapter<PersionInfo>(MainActivity.this, mDatas, R.layout.item_adapter) {

            @Override
            public void convert(ViewHolder helper, final PersionInfo item) {
                helper.setText(R.id.tv_show, item.getName());
                helper.setImageByUrl(item.getHead(), R.id.iv_head);
                helper.setOnClickListener(R.id.tv_show, new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        Toast.makeText(mContext, item.getName(), 1).show();

                    }
                });
            }
        };
        lv.setAdapter(myAdapter);
    }


}
  1. 勿忘添加权限:切记切记 ,,,坑啊。。。。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
  1. 最后看看效果图:
    这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/12884.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!