android打造万能的适配器(转)

时间:2022-09-03 22:13:51

荒废了两天,今天与大家分享一个ListView的适配器

前段时间在学习慕课网的视频,觉得这种实现方式较好,便记录了下来,最近的项目中也使用了多次,节省了大量的代码,特此拿来与大家分享一下。

还是先看图片,这里我模仿博客园App的列表样式做了一个静态的数据列表

android打造万能的适配器(转)   android打造万能的适配器(转)

这里用到的类比较多,不过核心的只有两个,其余均为演示所用,先来看核心的两个类

ViewHolderM.java

 
package landptf.tools;

import android.content.Context;
import android.text.Spanned;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView; /**
* @author landptf
* 公共的ViewHolder
*/
public class ViewHolderM {
private SparseArray<View> viewArray;
private int position;
private View mConvertView;
private Object tag; /**
* 构造方法
* @param context
* @param convertView
* @param parent
* @param layoutId
* @param position
*/
public ViewHolderM(Context context, View convertView, ViewGroup parent,
int layoutId, int position) {
this.position = position;
//使用SparseArray效率高一些
viewArray = new SparseArray<View>();
//加载布局
mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,false);
//将ViewHolderM赋值给View的Tag
mConvertView.setTag(this);
} public static ViewHolderM get(Context context, View convertView,
ViewGroup parent, int layoutId, int position) {
if (convertView == null) {
//如果convertView为空,则实例化ViewHolderM
return new ViewHolderM(context, convertView, parent, layoutId,position);
} else {
//否则从convertView的Tag中取出ViewHolderM,避免重复创建
ViewHolderM holder = (ViewHolderM) convertView.getTag();
holder.position = position;
return holder;
}
} public View getConvertView() {
return mConvertView;
} public Object getTag() {
return tag;
} public void setTag(Object tag) {
this.tag = tag;
} public int getPosition() {
return position;
} public void setPosition(int position) {
this.position = position;
} /**
* 通过viewId获取控件对象
* @param viewId
* @return
*/
@SuppressWarnings("unchecked")
public <T extends View> T getView(int viewId) {
View view = viewArray.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
viewArray.put(viewId, view);
}
return (T) view;
} /**------------------------------------华丽的分割线------------------------------------*/
/**以下方法为额外封装的方法,只是简单几个,以后可以慢慢完善*/ /**
* 设置TextView的内容
* @param viewId
* @param text
* @return
*/
public ViewHolderM setText(int viewId, String text) {
TextView tv = getView(viewId);
tv.setText(text);
return this;
} /**
* 设置TextView的内容
* @param viewId
* @param text,Spanned类型,可设置部分字体变色
* @return
*/
public ViewHolderM setText(int viewId, Spanned text) {
TextView tv = getView(viewId);
tv.setText(text);
return this;
} /**
* 设置图片的可见性
* @param viewId
* @param visible
* @return
*/
public ViewHolderM setImageViewVisible(int viewId, Boolean visible){
ImageView iv = getView(viewId);
if (visible) {
iv.setVisibility(View.VISIBLE);
}else {
iv.setVisibility(View.GONE);
}
return this;
}
}
 

2 AdapterM.java

 
package landptf.tools;

import java.util.List;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter; /**
* @author landptf
* 公共的Adapter List适配器
*/
public abstract class AdapterM<T> extends BaseAdapter { private Context context;
//为丰富程序功能,提供了两种常见的数据类型
private List<T> dataList = null;//数据源List<T>
private T[] dataArray = null;//数据源T[]
//布局文件ID
private int layoutId; /**
* 构造方法
* @param context
* @param layoutId
* @param dataList
*/
public AdapterM(Context context,int layoutId, List<T> dataList) {
this.context = context;
this.dataList = dataList;
this.layoutId = layoutId;
} /**
* 构造方法(与上一个只有数据源不同)
* @param context
* @param layoutId
* @param dataArray
*/
public AdapterM(Context context,int layoutId, T[] dataArray) {
this.context = context;
this.dataArray = dataArray;
this.layoutId = layoutId;
} @Override
public int getCount() {
if (dataList != null) {
return dataList.size();
}else {
return dataArray.length;
}
}
@Override
public T getItem(int position) {
if (dataList != null) {
return dataList.get(position);
}else {
return dataArray[position];
} }
@Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolderM holder = new ViewHolderM(context, convertView, parent,layoutId, position);
convert(holder,getItem(position));
return holder.getConvertView();
}
/**
* 需实现的抽象方法
* @param holder
* @param model
*/
public abstract void convert(ViewHolderM holder, T model);
}
 

接下来看布局文件,一共两个一个是activity的页面,一个列表项
activity_list.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="match_parent"
android:background="#EFEFEF" > <include android:id="@+id/title" layout="@layout/child_titlebarm" /> <ListView
android:id="@+id/lv_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/title"
android:layout_marginTop="10dp"
android:background="@android:color/white"
android:divider="#A9A9A9"
android:dividerHeight="1dp">
</ListView> </RelativeLayout>
 

item_messgae.xml

 
<?xml version="1.0" encoding="utf-8"?>
<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="wrap_content"
tools:ignore="HardcodedText" > <TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:maxLines="2"
android:textColor="#696969"
android:textSize="20sp" /> <TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tv_title"
android:layout_below="@+id/tv_title"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:maxLines="3"
android:textColor="#696969"
android:textSize="16sp" /> <TextView
android:id="@+id/tv_comment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tv_content"
android:layout_below="@+id/tv_content"
android:layout_marginTop="10dp"
android:textColor="#696969"
android:textSize="18sp" /> <TextView
android:id="@+id/tv_read"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/tv_comment"
android:layout_centerHorizontal="true"
android:textColor="#696969"
android:textSize="18sp" /> <TextView
android:id="@+id/tv_collect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/tv_read"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:text="立马收藏"
android:textColor="#696969"
android:textSize="18sp" /> </RelativeLayout>
 

接下来我们定义了一个Adapter类继承AdapterM,ListAdapter.java

 
package landptf.test;

import landptf.control.R;
import android.content.Context;
import landptf.tools.AdapterM;
import landptf.tools.ViewHolderM; /**
* @author landptf
* ListAdapter List适配器
*/
public class ListAdapter extends AdapterM<MessageBean>{ public ListAdapter(Context context, int layoutId, MessageBean[] dataArray) {
super(context, layoutId, dataArray);
} @Override
public void convert(ViewHolderM holder, MessageBean model) {
// 为个控件绑定内容
holder.setText(R.id.tv_title, model.getTitle());
holder.setText(R.id.tv_content, model.getContent());
holder.setText(R.id.tv_comment, model.getComment() + "条评论");
holder.setText(R.id.tv_read, model.getRead() + "阅读");
}
}
 

最后是Activity类,ListActivity.java

 
package landptf.test;

import landptf.control.R;
import landptf.control.TitleBarM;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView; /**
* @author landptf
* List适配器测试类
*/
public class ListActivity extends Activity{
//这里用到了之前的自定义标题栏
//如果感兴趣可以看一下我的上一篇博客,否则忽略即可
private TitleBarM tbTitle;
//ListView对象
private ListView lvList;
//自定义Adapter
private ListAdapter listAdapter;
//数据源实体,这里用数组作为示例,大家也可以选择使用List作为数据源
private MessageBean[] msgArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
initView();
} private void initView() {
tbTitle = (TitleBarM) findViewById(R.id.tbm_title);
tbTitle.setTitleText("打造万能的适配器");
initData();
lvList = (ListView) findViewById(R.id.lv_list);
listAdapter = new ListAdapter(this, R.layout.item_message, msgArray);
lvList.setAdapter(listAdapter);
} //装载数据
private void initData() {
msgArray = new MessageBean[10];
msgArray[0] = new MessageBean("Android 自定义标题栏", "今天来看一下如何通过组合多个控件实现自定义标题栏众所周知,标题栏是应用中必不可少的控件,为了避免多次重写,将其封装起来,供每个布局调用即可。这里我们采用经典的左中右布局,也可以根据项目需要自行调整,比如在右侧再加一个控件,或者将标题偏左都可以注:其中应用到了上一篇文章中的ButtonM控件,大家可以", 0, 273);
msgArray[1] = new MessageBean("android自定义控件,动态设置Button样式", "今天来看一个通过重写Button来动态实现一些效果,如圆角矩形、圆形、按下改变字体,改变背景色,改变背景图等在此说明一下,这种实现方式绝对不是唯一的,而且通过xml文件即可简单实现,这样做只是为了将控件的样式完全由代码实现,更方便打包应用于其他项目下面来看几张效果图: 图1 初始状态 图2 按下第一", 0, 400);
msgArray[2] = new MessageBean("Android 自定义控件实现TextView按下后字体颜色改变", "今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能直接看图片 第一张是按下后截的图,功能很简单,也很容易实现,下面来看一下如何通过重写TextView来实现一共三个文件 TextViewM.java,MainActivit", 0, 202);
msgArray[3] = new MessageBean("Android 自定义标题栏", "今天来看一下如何通过组合多个控件实现自定义标题栏众所周知,标题栏是应用中必不可少的控件,为了避免多次重写,将其封装起来,供每个布局调用即可。这里我们采用经典的左中右布局,也可以根据项目需要自行调整,比如在右侧再加一个控件,或者将标题偏左都可以注:其中应用到了上一篇文章中的ButtonM控件,大家可以", 0, 273);
msgArray[4] = new MessageBean("android自定义控件,动态设置Button样式", "今天来看一个通过重写Button来动态实现一些效果,如圆角矩形、圆形、按下改变字体,改变背景色,改变背景图等在此说明一下,这种实现方式绝对不是唯一的,而且通过xml文件即可简单实现,这样做只是为了将控件的样式完全由代码实现,更方便打包应用于其他项目下面来看几张效果图: 图1 初始状态 图2 按下第一", 0, 400);
msgArray[5] = new MessageBean("Android 自定义控件实现TextView按下后字体颜色改变", "今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能直接看图片 第一张是按下后截的图,功能很简单,也很容易实现,下面来看一下如何通过重写TextView来实现一共三个文件 TextViewM.java,MainActivit", 0, 202);
msgArray[6] = new MessageBean("Android 自定义标题栏", "今天来看一下如何通过组合多个控件实现自定义标题栏众所周知,标题栏是应用中必不可少的控件,为了避免多次重写,将其封装起来,供每个布局调用即可。这里我们采用经典的左中右布局,也可以根据项目需要自行调整,比如在右侧再加一个控件,或者将标题偏左都可以注:其中应用到了上一篇文章中的ButtonM控件,大家可以", 0, 273);
msgArray[7] = new MessageBean("android自定义控件,动态设置Button样式", "今天来看一个通过重写Button来动态实现一些效果,如圆角矩形、圆形、按下改变字体,改变背景色,改变背景图等在此说明一下,这种实现方式绝对不是唯一的,而且通过xml文件即可简单实现,这样做只是为了将控件的样式完全由代码实现,更方便打包应用于其他项目下面来看几张效果图: 图1 初始状态 图2 按下第一", 0, 400);
msgArray[8] = new MessageBean("Android 自定义控件实现TextView按下后字体颜色改变", "今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能直接看图片 第一张是按下后截的图,功能很简单,也很容易实现,下面来看一下如何通过重写TextView来实现一共三个文件 TextViewM.java,MainActivit", 0, 202);
msgArray[9] = new MessageBean("Android 自定义标题栏", "今天来看一下如何通过组合多个控件实现自定义标题栏众所周知,标题栏是应用中必不可少的控件,为了避免多次重写,将其封装起来,供每个布局调用即可。这里我们采用经典的左中右布局,也可以根据项目需要自行调整,比如在右侧再加一个控件,或者将标题偏左都可以注:其中应用到了上一篇文章中的ButtonM控件,大家可以", 0, 273);
}
}
 

以上便是全部代码,这样以后再新增其他ListView都不需要再定义一个Adapter,一个ViewHolder,上面的ListAdapter也可以不需要,直接在Activity里实现定义AdapterM即可,但是一些复杂的列表项还是建议自定义一个Adapter去继承AdapterM.

最后本着互联网开放、分享的精神,将原视频地址附上http://www.imooc.com/learn/372,个人比较喜欢慕课网。

android打造万能的适配器(转)的更多相关文章

  1. listview-android:打造万能通用适配器&lpar;转&rpar;

    转载:https://blog.csdn.net/q649381130/article/details/51781921: 1.前言 listview作为安卓项目中一个的明星控件,它的适配器的写法是广 ...

  2. Android——打造万能适配器&lpar;CommonAdapter&rpar;

    List<T> : ListView -> Adapter extends BaseAdapter -> ViewHolder ViewHolder CommonAdaper ...

  3. Android 快速开发系列 打造万能的ListView GridView 适配器

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38902805 ,本文出自[张鸿洋的博客] 1.概述 相信做Android开发的写 ...

  4. android listview万能适配器

    参考    Android 快速开发系列 打造万能的ListView GridView 适配器 Hongyang public class CommonViewHolder { private Con ...

  5. 安卓开发笔记——打造万能适配器&lpar;Adapter&rpar;

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  6. Android—万能ListView适配器

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...

  7. Path特效之PathMeasure打造万能路径动效

    前面两篇文章主要讲解了 Path 的概念和基本使用,今天我们一起利用 Path 做个比较实用的小例子: 上一篇我们使用 Path 绘制了一个小桃心,我们这一篇继续围绕着这个小桃心进行展开: ----- ...

  8. Android -- ListView&lpar;SimpleAdapter&rpar; 自定义适配器

    aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA ...

  9. Android 打造炫目的圆形菜单 秒秒钟高仿建行圆形菜单

    原文:Android 打造炫目的圆形菜单 秒秒钟高仿建行圆形菜单 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43131133, ...

随机推荐

  1. Entity Framework &amp&semi;&amp&semi; Lambda

    Lambda表达式详细总结 C# 代码了解委托.匿名方法.Lambda 表达式和闭包本质 将使用了C# Lambda表达式的程序集反编译后,我们发现,它实际上和匿名方法没有什么不同.Lambda的输入 ...

  2. 原生态AJAX详解和jquery对AJAX的封装

    AJAX: A :Asynchronous [eI`sinkrenes] 异步 J :JavaScript    JavaScript脚本语言 A: And X :XML 可扩展标记语言 AJAX现在 ...

  3. 2012年第三届蓝桥杯C&sol;C&plus;&plus;程序设计本科B组决赛

    1.星期几(取余/excel) 2.数据压缩 3.拼音字母(比较) 4.DNA比对(dp) 5.方块填数 1.星期几[结果填空] (满分5分)    1949年的国庆节(10月1日)是星期六.     ...

  4. mysql主从复制原理

    复制如何工作 整体上来说,复制有3个步骤: (1)    master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events):       ...

  5. EXchange2010配置

    DAG配置: 组织配置:如果见证服务器是DC不是exchange服务器,那么需要在AD用户和计算机里面,将exchange trusted subsystem 添加到 DC的本地管理员组(/built ...

  6. Android开发之UI的编程方式创建

    我们知道,android中一个activity对应一个xml的UI配置文件,除了用xml文件配置的方式创建用户界面外,还可以使用代码编程的方式来创建一个用户界面.如果用户界面需要在运行过程中动态生成的 ...

  7. &lbrack;CSAPP笔记&rsqb;&lbrack;第二章信息的表示和处理&rsqb;

    信息的表示和处理 2.1 信息存储 机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器. 存储器的每个字节由一个唯一的数字表示,称为它的地址 所有可能地址的集合称为虚拟地址空间 2.1.1 十 ...

  8. XSS(笔记1)

    概念 跨站脚本(Cross-Site Scripting,XSS) 发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被预期的脚本指令并执行时,XSS就会发生.为 ...

  9. Easyui-textbox得到焦点方法

    得到焦点是我们在编写前台时经常使用到的,为了提高用户的体验度,话不多说直接上代码. jsp页面: <div class="box_xian"> <span cla ...

  10. maven&lpar;六&rpar;,外置maven运行环境配置

    外置maven eclipse内置的maven插件是固定版本,如果要用其他版本的maven,可以使用外置maven 下载地址: http://maven.apache.org/download.cgi ...