打造Listview的万能适配CommonAdapter(方便以后查找)

先上布局:
activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:materialdesign="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- ... XML CODE -->
    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

    </ListView>
</RelativeLayout>

listview的子布局item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp" >

    <CheckBox
        android:focusable="false"
        android:id="@+id/cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerInParent="true" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:singleLine="true"
        android:text="Android新技能 Get" />

    <TextView
        android:id="@+id/tv_desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_title"
        android:layout_marginTop="10dp"
        android:layout_toLeftOf="@id/cb"
        android:maxLines="2"
        android:text="Android-打造万能的ListView和GridView适配器"
        android:textColor="#898989" />

    <TextView
        android:id="@+id/tv_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_desc"
        android:layout_marginTop="10dp"
        android:text="2015-08-05"
        android:textColor="#898989"
        android:textSize="12sp" />

    <TextView
        android:id="@+id/tv_phone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@id/tv_desc"
        android:layout_marginTop="10dp"
        android:background="#20793D"
        android:maxLines="1"
        android:text="10086"
        android:padding="4dp"
        android:textColor="#FFF" />

</RelativeLayout>

这里写图片描述

CommonAdapter.java:


/**
 * Created by bo on 2017/7/10.
 */

public abstract class CommonAdapter<T> extends BaseAdapter {
    private Context mContext;
    private List<T> mDatas;
    private LayoutInflater mInflater;
    private int mlayoutId;

    public CommonAdapter(Context context, List<T> datas, int layoutId) {
        this.mContext = context;
        this.mDatas = datas;
        mInflater = LayoutInflater.from(context);
        this.mlayoutId = layoutId;
    }
    @Override
    public int getCount() {
        return mDatas.size();
    }

    @Override
    public T 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) {
        ViewHolder holder = ViewHolder.get(mContext, arg1, arg2, mlayoutId,
                arg0);
        convert(holder, getItem(arg0));

        return holder.getConvertView();
    }
    public abstract void convert(ViewHolder holder, T t);

}

以上的抽象方法convert(ViewHolder holder, T t);就相当于以前通用代码中的
viewHolder.mTextView = (TextView) convertView .findViewById(R.id.id_tv_title);
viewHolder.mTextView.setText(Bean.getName());
找到控件的id再去设施setText等重复的代码方法中的参数ViewHolder holder, T t holder就相当于以前通用代码中的viewHolder,t就相当于一个自己定义的实体类Bean。

注: T 代表的是泛型 ,意思就是 你 new 的是什么类型传入的就是什么 类型
Test 这里就是你传入的是 String 类型
所以 private T t;的这个T就是 private String t;

上文的getview()中的ViewHolder.class:

/**
 * Created by bo on 2017/7/10.
 */

public class ViewHolder {
    //SparseArray类存放view集合
    private SparseArray<View> mViews;

    private int mPosition;

    //布局文件
    private View mConvertView;

    public View getConvertView() {
        return mConvertView;
    }

    public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) {
        this.mViews = new SparseArray<View>();
        this.mPosition = position;
        this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
        this.mConvertView.setTag(this);
    }

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

    /**
     *   * 通过控件的id获取对应的控件,如果没有则加入views
     *   * @param viewId
     *   * @return
     *   
     */


    public <T extends View> T getView(int viewId) {
        View view = mViews.get(viewId);

        if (null == view) {
            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 tv = getView(viewId);
        tv.setText(text);
        return this;
    }

    /**
     *   * 为ImageView设置图片
     *   *
     *   * @param viewId
     *   * @param drawableId
     *   * @return
     *   
     */


    public ViewHolder setImageResource(int viewId, int drawableId)


    {
        ImageView view = getView(viewId);
        view.setImageResource(drawableId);
        return this;
    }


    public int getPosition()


    {
        return mPosition;
    }
}

再写一个Adapter继承于万能适配器CommonAdapter,还是要写一个自己的Adapter,因为一个项目可能会有多个ListView,但是每个的item元素,布局都会有所不同的,这个类用来区分不同的ListView与自己所对应的item.这个代码量较少完全可以写成内部类在Activity.java中.

/**
 * Created by bo on 2017/7/10.
 */

public class MyAdapter extends CommonAdapter<Bean> {

    public MyAdapter(Context context, List<Bean> datas, int layoutId) {
        super(context, datas, layoutId);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void convert(ViewHolder holder, final Bean bean) {
        // TODO Auto-generated method stub
        holder.setText(R.id.tv_title, bean.getTitle())
                .setText(R.id.tv_desc, bean.getDesc())
                .setText(R.id.tv_time, bean.getTime())
                .setText(R.id.tv_phone, bean.getPhone());
        /**
         * 防止CheckBox混乱
         */
        final CheckBox cBox = (CheckBox)(holder.getView(R.id.cb));
        if (cBox != null)
        {
            cBox.setChecked(bean.isChecked());

            cBox.setOnClickListener(new OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    bean.setChecked(cBox.isChecked());
                }
            });
        }
    }

}

再写一个实体类Bean:

/**
 * Created by bo on 2017/7/10.
 */

public class Bean {
    private String title;
    private String desc;
    private String time;
    private String phone;
    private boolean isChecked;

    public boolean isChecked() {
        return isChecked;
    }

    public void setChecked(boolean isChecked) {
        this.isChecked = isChecked;
    }

    /**
     * @param title
     * @param desc
     * @param time
     * @param phone
     */
    public Bean(String title, String desc, String time, String phone) {
        this.title = title;
        this.desc = desc;
        this.time = time;
        this.phone = phone;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

}

MainActivity:

public class MainActivity extends Activity {
    private ListView listView;
    private List<Bean> mDatas;
    /**
     * 适配器
     */
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        //listener是为整个item提供监听,当点击时会跳转到SecondActivity
//        listener();
    }

//    private void listener() {
//        // TODO Auto-generated method stub
//        listView.setOnItemClickListener(new OnItemClickListener() {
//
//            @Override
//            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
//                                    long arg3) {
//                // TODO Auto-generated method stub
//                startActivity(new Intent(MainActivity.this, SecondActivity.class));
//            }
//        });
//    }

    private void initData() {
        // TODO Auto-generated method stub
        mDatas = new ArrayList<Bean>();
        Bean bean = new Bean("Android新技能 Get",
                "Android-打造万能的ListView和GridView适配器", "2015-08-05", "10086");
        mDatas.add(bean);
        bean = new Bean("Android-打造万能的ListView和GridView适配器",
                "Android-打造万能的ListView和GridView适配器", "2015-08-06", "10086");
        mDatas.add(bean);
        bean = new Bean("Android-打造万能的ListView和GridView适配器",
                "Android-打造万能的ListView和GridView适配器", "2015-08-07", "10086");
        mDatas.add(bean);

        adapter = new MyAdapter(this, mDatas, R.layout.item);
        listView.setAdapter(adapter);

    }

    private void initView() {
        // TODO Auto-generated method stub
        listView = (ListView) findViewById(R.id.listview);
    }

}

参数有上下文,集合,和自己对应的item就可以了
adapter = new MyAdapter(this, mDatas, R.layout.item);

附上原文地址:http://www.jb51.net/article/92266.htm

2017/7/11追加

这一段纠结了好久
在Activity中使用的在Fragment中同样适用,不过正在写的程序中fragment嵌套于一个acticity中,之前使用的 listView = (ListView) getActivity.findViewById(R.id.listview);获取的是父容器中的listview,然而父容器中不存在,所以加载不出一直报错
在fragment中需要这样写:

View view = inflater.inflate(R.layout.fragment_one, container, false);
listview = (ListView)view.findViewById(R.id.listview);
initData();
return view;

只有在onCreateView里面获取view对应的才行

过段时间看看RecycleView的使用和适配,RecycleView比listView变化更多且方便

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值