ListView万能适配器CommonAdapter

CommonAdapter:

/*
 *  @Copyright (c) tianchenglin
 *  @Author TCL
 *  @Date 2016.7.5
 */

package com.study.tcl.commonadapter;

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

import java.util.List;

/**
 * Created by TCL on 2016/7/5.
 */
public abstract class CommonAdapter<T> extends BaseAdapter {

    private Context mContext;
    private List<T> mData;
    private int mItemLayoutId;//每一行item布局文件

    public CommonAdapter(Context context, List<T> data, int itemLayoutId) {
        this.mContext = context;
        this.mData = data;
        this.mItemLayoutId = itemLayoutId;
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public T getItem(int position) {
        return mData.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = ViewHolder.getInstance(mContext, convertView, parent, mItemLayoutId, position);
        //填充数据
        convert(viewHolder, getItem(position));
        return viewHolder.getConvertView();
    }

    public abstract void convert(ViewHolder viewHolder, T item);
}
ViewHolder:

/*
 *  @Copyright (c) tianchenglin
 *  @Author TCL
 *  @Date 2016.7.5
 */

package com.study.tcl.commonadapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by TCL on 2016/7/5.
 */
public class ViewHolder {

    private SparseArray<View> mViews;//稀疏数组,里面放的是一行里面所有的控件
    private int mPosition;
    private View mConvertView;//每一行对应的布局

    //采用单例模式
    private ViewHolder(Context context, ViewGroup parent, int layoutId, int position) {
        this.mPosition = position;
        this.mViews = new SparseArray<View>();

        /**此处用LayoutInflater,直接使用View.inflate报错**/
        this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
        this.mConvertView.setTag(this);
    }

    /**
     * 获取ViewHolder对象
     *
     * @return
     */
    public static ViewHolder getInstance(Context context, View convertView, ViewGroup parent, int layoutId, int
            position) {
        if (convertView == null) {
            synchronized (ViewHolder.class) {
                return new ViewHolder(context, parent, layoutId, position);
            }
        } else {
            return (ViewHolder) convertView.getTag();
        }
    }

    /**
     * 通过控件的id得到相应的控件(因为不知道控件的类型,要用到泛型)
     */
    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赋值
     */
    public ViewHolder setText(int viewId, String text) {
        TextView view = getView(viewId);//找到控件
        view.setText(text);
        return this;
    }

    /**
     * 为ImageView设置图片
     */
    public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
        ImageView view = getView(viewId);
        view.setImageBitmap(bitmap);
        return this;
    }

    /**
     * 返回行号
     *
     * @return
     */
    public int getPosition() {
        return mPosition;
    }

    /**
     * 返回行view
     *
     * @return
     */
    public View getConvertView() {
        return mConvertView;
    }
}
MainActivity:

/*
 *  @Copyright (c) tianchenglin
 *  @Author TCL
 *  @Date 2016.7.5
 */

package com.study.tcl.commonadapter;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView lv_list;
    //准备数据
    private List<String> mData = new ArrayList<String>(Arrays.asList("宋江", "卢俊义", "吴用",
            "公孙胜", "关胜", "林冲", "秦明", "呼延灼", "花荣", "柴进", "李应", "朱仝", "鲁智深",
            "武松", "董平", "张清", "杨志", "徐宁", "索超", "戴宗", "刘唐", "李逵", "史进", "穆弘",
            "雷横", "李俊", "阮小二", "张横", "阮小五", " 张顺", "阮小七", "杨雄", "石秀", "解珍",
            " 解宝", "燕青", "朱武", "黄信", "孙立", "宣赞", "郝思文", "韩滔", "彭玘", "单廷珪",
            "魏定国", "萧让", "裴宣", "欧鹏", "邓飞", " 燕顺", "杨林", "凌振", "蒋敬", "吕方",
            "郭 盛", "安道全", "皇甫端", "王英", "扈三娘", "鲍旭", "樊瑞", "孔明", "孔亮", "项充",
            "李衮", "金大坚", "马麟", "童威", "童猛", "孟康", "侯健", "陈达", "杨春", "郑天寿",
            "陶宗旺", "宋清", "乐和", "龚旺", "丁得孙", "穆春", "曹正", "宋万", "杜迁", "薛永", "施恩"));

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        this.lv_list = (ListView) findViewById(R.id.lvList);
        //设置适配器
        lv_list.setAdapter(new CommonAdapter<String>(getApplicationContext(), mData, R.layout.item) {

            @Override
            public void convert(ViewHolder viewHolder, String item) {
                viewHolder.setText(R.id.tvName, item);
            }
        });
    }
}

activity_main:

<?xml version="1.0" encoding="utf-8"?>
<!--
  ~  @Copyright (c) tianchenglin
  ~  @Author TCL
  ~  @Date 2016.7.5
  -->

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.study.tcl.commonadapter.MainActivity">

    <ListView
        android:id="@+id/lvList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
</RelativeLayout>
item:

<?xml version="1.0" encoding="utf-8"?>
<!--
  ~  @Copyright (c) tianchenglin
  ~  @Author TCL
  ~  @Date 2016.7.5
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical">

    <TextView
        android:id="@+id/tvName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#000000"
        android:textSize="18sp"/>

</LinearLayout>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CommonAdapter 一个适用于ListView/GridView/RecyclerView的Adapter库,简化大量重复代码,支持多种布局,可自定义图片加载的实现。功能特点:简化大量重复代码支持多布局自定义图片加载常用数据操作view复用RecyclerView item 点击和长按事件gradle依赖dependencies {     compile 'com.classic.adapter:commonadapter:1.0'     //项目中使用到RecyclerView,需要添加依赖     compile 'com.android.support:recyclerview-v7:23.2.0'}ListView/GridView 使用示例:List<News> newsList = ...; //单布局文件 listView = (ListView) findViewById(R.id.listview); listView.setAdapter(new CommonAdapter<News>(context,     //item布局文件     R.layout.item_none_picture, newsList ) {     @Override public void onUpdate(BaseAdapterHelper helper, News item) {         //BaseAdapterHelper详细用法,见下方         helper.setText(R.id.xxx, item.getTitle())                //可实现ImageLoad接口,进行图片自定义加载方式,demo里面使用的Glide               .setImageLoad(new GlideImageLoad())               .setImageUrl(R.id.xxx,item.getCoverUrl());     } }); //多布局文件 private final class MultipleLayoutAdapter extends CommonAdapter<News>{     public MultipleLayoutAdapter(Context context, int layoutResId, List<News> data) {         super(context, layoutResId, data);     }     //多种布局重写此方法即可     @Override public int getLayoutResId(News item) {         int layoutResId = -1;         switch (item.getNewsType()){             case News.TYPE_NONE_PICTURE: //布局样式一                 layoutResId = R.layout.item_none_picture;                 break;             case News.TYPE_SINGLE_PICTURE: //布局样式二                 layoutResId = R.layout.item_single_picture;                 break;             case News.TYPE_MULTIPLE_PICTURE: //布局样式三                 layoutResId = R.layout.item_multiple_picture;                 break;             更多的布局样式 ...         }         return layoutResId;     }     @Override public void onUpdate(BaseAdapterHelper helper, News item) {         helper.setImageLoad(new GlideImageLoad());         switch (item.getNewsType()){             case News.TYPE_NONE_PICTURE: //布局样式一                 helper.setText(R.id.xxx, item.getTitle())                       .setImageUrl(R.id.xxx,item.getCoverUrl());                 break;             case News.TYPE_SINGLE_PICTURE: //布局样式二                 helper.setText(R.id.xxx, item.getTitle())                       .setImageUrl(R.id.xxx,item.getCoverUrl());                 break;             case News.TYPE_MULTIPLE_PICTURE: //布局样式三                 helper.setText(R.id.xxx, item.getTitle())                       .setImageUrl(R.id.xxx,item.getCoverUrl());                 break;             更多的布局样式 ...         }     } }
Listview是Android开发中常用的一个控件,而适配器则是用来将数据与ListView进行绑定的工具。下面是一个简单的Listview结合适配器的例子: 1. 准备数据 首先需要准备一个数据源,例如一个字符串数组: ``` String[] data = new String[]{"apple", "banana", "orange", "pear"}; ``` 2. 创建适配器 创建一个适配器类,继承自BaseAdapter,并实现其中的四个方法: ``` public class MyAdapter extends BaseAdapter { private String[] mData; public MyAdapter(String[] data) { mData = data; } @Override public int getCount() { return mData.length; } @Override public Object getItem(int position) { return mData[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false); } TextView textView = convertView.findViewById(android.R.id.text1); textView.setText(mData[position]); return convertView; } } ``` 其中,getCount()方法返回数据源的长度;getItem()方法返回指定位置的数据项;getItemId()方法返回指定位置的数据项的ID;getView()方法返回指定位置的数据项的视图。 3. 创建Listview并绑定适配器 在布局文件中添加一个ListView并给它一个id: ``` <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 在Activity中,找到ListView并创建适配器并将其绑定到Listview上: ``` ListView listView = findViewById(R.id.list_view); MyAdapter adapter = new MyAdapter(data); listView.setAdapter(adapter); ``` 这样就完成了ListView结合适配器的基本操作。需要注意的是,在getView()方法中,如果convertView为null,则需要通过LayoutInflater创建视图,并将其缓存起来,以便下次使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值