ListView适配器之增强版BaseAdapter

原创 2015年07月07日 18:11:56
以往我们要写一个ListView的适配器的时候,我们往往要先继承BaseAdapter,然后在重写很多方法,然后再在**getView(int position, View view, ViewGroup viewGroup)** 函数里面,写我们的itemView的逻辑,其实无非就是三点:
  1. inflate 视图布局
  2. 绑定视图
  3. 绑定数据(也就是我们的视图的逻辑)

    因此,这就是我下面要做的一些事情:把构造的关键步骤全部抽取成抽象函数,封装在父类当中,子类实现只需要在重写的方法里面实现就好了。


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.List;

/**
 * an Enhanced abstract BaseAdapter .
 *
 * Created by Tata on 15/7/7.
 */
public abstract class AbstractBaseAdapter<T,V> extends BaseAdapter {


    private LayoutInflater mInflater;
    private List<T> mDatas;
    private Context mContext;


    public AbstractBaseAdapter(Context mContext) {
        this.mContext = mContext;
        mInflater = LayoutInflater.from(mContext);
    }

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

    @Override
    public T getItem(int i) {
        return mDatas == null ? null : mDatas.get(i);
    }

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

    public void setData(List<T> data) {
        mDatas = data;
        notifyDataSetChanged();
    }

    public void appendData(List<T> appendedData) {
        if (mDatas != null)
            mDatas.addAll(appendedData);
        notifyDataSetChanged();
    }

    public void clearData() {
        mDatas.clear();
        notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {

         V viewHolder = null;
        if (view == null) {


            viewHolder = getViewHolder();
            view = mInflater.inflate(getItemLayoutId(), null);
            onCreateItemView(position, viewHolder, view);

            view.setTag(viewHolder);
        } else {
            viewHolder = (V) view.getTag();
        }

        onCreateItemData(view, viewHolder, position);

        return view;
    }


    /**
     * Retrieve the current item layou id.
     *
     * @return
     */
    protected abstract int getItemLayoutId();


    /**
     * Retrieve an instance of ViewHolder which was inherited from baseViewHolder
     *
     * @return
     */
    protected abstract V getViewHolder();

    /**
     * Called when the item view was first created.
     *
     * @param position
     * @param viewHolder
     * @param view
     */
    protected abstract void onCreateItemView(int position, V viewHolder, View view);

    /**
     * Called when the item view was filled with data.
     *
     * @param view
     * @param viewHolder
     * @param position
     */
    protected abstract void onCreateItemData(View view, V viewHolder, int position);


}

下面是一个demo:

import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by Tata on 15/7/7.
 */
public class DemoAdapter extends AbstractBaseAdapter<DemoAdapter.Info, DemoAdapter.ViewHolder> {

    //the item layout resource id
    private int layoutid = 0x001;

    public DemoAdapter(Context mContext) {
        super(mContext);
    }

    @Override
    protected int getItemLayoutId() {
        return layoutid;
    }

    @Override
    protected ViewHolder getViewHolder() {
        return new ViewHolder();
    }


    @Override
    protected void onCreateItemView(int position, ViewHolder viewHolder, View view) {

        viewHolder.icon = (ImageView) view.findViewById(000);
        viewHolder.name = (TextView) view.findViewById(0000);

    }

    @Override
    protected void onCreateItemData(View view, ViewHolder viewHolder, int position) {

        viewHolder.icon.setImageResource(0);
        viewHolder.name.setText("tata");
    }

    static class ViewHolder {
        private TextView name;
        private ImageView icon;
    }


    /**
     * data-bean
     */
    class Info {
        private String name;
        private int resId;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getResId() {
            return resId;
        }

        public void setResId(int resId) {
            this.resId = resId;
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

增强版ListView-RecyclerView

RecyclerView本文参考郭霖《第一行代码》第2版Recycyler不仅可以轻松实现和ListView同样的效果,还优化了ListView中存在的各种不足之处(性能不好,扩展性差,只能纵向滚动)...

ListView控件:(3)BaseAdapter适配器生成

1.编写BaseAdapterActivity.java类 package com.example.yun; import java.util.ArrayList; import java.uti...

Android学习ListView自定义布局,适配器BaseAdapter

关于BaseAdapter的学习,看了下别人的博客,自己写了个demo,觉得这样学习效率会高些。 一:先改写activity_main.xml:           xmlns:tools=...

ListView的优化和自定义适配器继承于BaseAdapter

ListView的优化和万能适配器继承于BaseAdapter          在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由...

android listview的适配器------baseadapter

基础篇: 适配器是一种设计模式,在android 中 比如说listview gridview recyclerview 等  都用到这个概念。就是对于不同的数据源展示到列表或者网格中。需要一个适配...

ListView的优化 +BaseAdapter适配器

文章为原创,请尊重原创!

ListView的适配器BaseAdapter使用详解

在Android中ListView的使用非常广泛,Android系统为我们提供了多中可供选择的适配器(Adapter),但我认为最好用的还是BaseAdapter。 一般我们继承自BaseAdapt...

ListView (3) 之适配器 ArrayAdapter/SimpleAdapter/BaseAdapter

ListView (3) 之适配器 AdapterArrayAdapter/SimpleAdapter/BaseAdapter的使用 Android中通过Adapter为AbsListView列表...

ListView应用Demo使用自定义的适配器继承BaseAdapter

使用ListView大部分都会使用自定义的适配器来达到显示更多种多样的内容,所以下面的例子就简单的使用了自定义的适配器。 1.XML文件代码: ...

Listview(下拉刷新,第三方插件XMLListView、PulltoRefresh),SimpleAdapter、BaseAdapter(适配器),优化,AsyncTask(异步任务,后台刷新)

下拉刷新 XMLLsitView PulltoRefresh
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ListView适配器之增强版BaseAdapter
举报原因:
原因补充:

(最多只允许输入30个字)