zoukankan      html  css  js  c++  java
  • android 手写万能adapter适配器

    android开发中,我们离不开adapter,每个项目都有很多地方需要adapter,那么我们如何让自己少写adapter代码呢?那就是封装adapter,让我们的adapter成为万能的adapter。下面我列出我实现的思路,供给大家学习与参考,当然有更好的方式也可以提供建议哦。

    一、针对Listview或GridView的万能适配器(源码)

     

    1.第一步实现公用的viewholder
    /**
    * 优化adapter用的ViewHolder
    * Created by admin on 17/8/2.
    */

    public class ViewHolder {

    //当前item的view
    private View mContentView;
    // 用于存储id用的容器
    private SparseArray<View>mViews;

    public ViewHolder(Context context, ViewGroup parent, int position, @LayoutRes int layoutId){


    this.mViews = new SparseArray<>();
    this.mContentView = LayoutInflater.from(context).inflate(layoutId,parent,false);
    this.mContentView.setTag(this);
    }

    /**
    * 创建view
    * @param context
    * @param contentView
    * @param parent
    * @param position
    * @param layoutId
    * @return
    */
    public static ViewHolder createView(Context context,View contentView,ViewGroup parent,int position,@LayoutRes int layoutId){

    if(contentView==null){

    return new ViewHolder(context,parent,position,layoutId);

    }else {

    ViewHolder holder = (ViewHolder) contentView.getTag();

    return holder;
    }

    }

    /**
    * 提供view给外部访问
    * @return
    */

    public View getContentView() {
    return mContentView;
    }


    /**
    * 通过id获取控件
    * @param id
    * @param <T>
    * @return
    */
    public <T extends View> T getViewById(@IdRes int id){


    View view = mViews.get(id);
    if(view==null){

    view = mContentView.findViewById(id);
    mViews.put(id,view);
    }

    return (T)view;

    }

    /**
    * 这里是设置文字当然还可以扩展更多如果有需要自己按这种方式实现一下就可以的
    * @param id
    * @param text
    * @return
    */
    public ViewHolder setText(@IdRes int id,CharSequence text){

    TextView view = getViewById(id);
    view.setText(text);
    return this;
    }

    }

    2.第二步实现公用的adapter
    /**
    * 公用adapter
    * Created by admin on 17/8/2.
    */

    public abstract class CommonAdapter<T> extends BaseAdapter {

    private List<T>list;
    private Context context;
    private int layoutId;
    public CommonAdapter(Context context,List<T>list,int layoutId){

    this.context=context;
    this.list=list;
    this.layoutId=layoutId;
    }

    @Override
    public int getCount() {
    return list==null? 0:list.size();
    }

    @Override
    public Object getItem(int position) {
    return list.get(position);
    }

    @Override
    public long getItemId(int position) {
    return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder = ViewHolder.createView(context,convertView,parent, position, layoutId);
    this.onBind(holder,list.get(position));
    return holder.getContentView();
    }

    protected abstract void onBind(ViewHolder holder,T model);
    }

    这样就可以实现万能的adapter了,接下来我们就只需要继承这个万能适配器就可以了轻松绑定数据了。
    3.调用
    public class MainActivity extends AppCompatActivity {
        private List<String>list=new ArrayList<>();

    private ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_butt_test);
           this.mListView = this.findViewById(R.id.listView)

    for(int i=0;i<30;i++){

    list.add("测试数据"+(i+1));
    }


    mListView.setAdapter(new CommonAdapter<String>(this,list,R.layout.list_item) {
    @Override
    protected void onBind(ViewHolder holder, String model) {
               //只需在这里绑定数据就ok了
                   holder.setText(R.id.title,model);

    }
    });
    }
    }
    
    
  • 相关阅读:
    正负样本不平衡的处理
    基于贝叶斯优化的超参数搜索
    Axure RP的基础使用
    keil:C语言里面调用汇编程序
    keil的使用:新建Project
    汇编入门:循环语句的汇编实现
    转gif图
    LeetCode题解 #5 Longest Palindromic Substring
    Android 从本地图库或拍照后裁剪图片并设置头像
    Android使用简单的Service
  • 原文地址:https://www.cnblogs.com/zzjbk/p/7275599.html
Copyright © 2011-2022 走看看