Android开发之万能适配器
ListView、GridView等等非常多的东西都需要适配器。而如果开发一个app每一个listview都有写一个Adapter的话,那还怎么愉快的玩游戏。。
什么是ViewHolider以及的用法和为什么要用?
这位博主写的非常好。
http://www.cnblogs.com/lichenwei/p/4085107.html
所谓的万能适配器,无非是将适配器的重复代码抽取出来进行封装。不同功能的代码则留写一个方法留给用户复写,则每个listview的适配器就只变成几句话就够了。
这是一般适配器的代码:
private class MyAdapter extends BaseAdapter
{ private Context mcontext=null;
private LayoutInflater inflater; public MyAdapter(Context c)
{
this.mcontext=c;
this.inflater=LayoutInflater.from(c);//from告诉系统从哪里获得布局填充器
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mListTitle.length;
} @Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
} @Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
} @Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
ViewHolder viewholder =null;
if (arg1==null)
{
viewholder=new ViewHolder();
arg1=inflater.inflate(R.layout.iconlist, arg2, false);
viewholder.iv=(ImageView)arg1.findViewById(R.id.imageview);
viewholder.title=(TextView)arg1.findViewById(R.id.title);
viewholder.text=(TextView)arg1.findViewById(R.id.text);
arg1.setTag(viewholder);
}
else
{
viewholder=(ViewHolder)arg1.getTag();
}
viewholder.iv.setImageResource(R.drawable.icon1);
viewholder.title.setText(mListTitle[arg0]);
viewholder.text.setText(mListStr[arg0]);
return arg1;
} }
private class ViewHolder
{
private ImageView iv=null;
private TextView title=null;
private TextView text=null;
}
首先我们先对ViewHolder进行封装:
1、ViewHolder将xml文件转换成convertview,并将转换后的view返回
2、要设置标签
3、判断convertview是否为空,空的话重新new创建,不为空的话getTag();
代码:
package com.example.list_view;
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class easyViewHolder { private SparseArray<View> sparseArray;
private Context context;
private int LayoutId;
private View convertview;
public easyViewHolder(Context mcontext,View mconvertview,int LayoutId,ViewGroup parent)
{
this.context=mcontext;
this.sparseArray=new SparseArray<View>();
this.convertview=LayoutInflater.from(mcontext).inflate(LayoutId, parent, false);
convertview.setTag(this);
}
public static easyViewHolder get(Context context,View convertview,int LayoutId,ViewGroup parent)
{
if (convertview==null)
{
return new easyViewHolder(context, convertview, LayoutId, parent);
} // 特别需要注意的一点,由于ListView的复用,比如屏幕只显示5个Item,那么当下拉到第6个时会复用第1个的Item,所以这边需要更新position
return (easyViewHolder)convertview.getTag(); }
public <T extends View> T getView(int viewId)//通过id找到组件
{
View view = sparseArray.get(viewId);
if (view==null)
{
view=(View)this.convertview.findViewById(viewId);
sparseArray.put(viewId, view);
}
return (T)view; }
public View getConvertView()
{
return this.convertview;
}
}
再封装一个适配器:
声明一个抽象类
1、保留不变的方法
2、修改getview()
3、写一个需要重写函数用来给用户传值。
package com.example.list_view; import java.util.ArrayList;
import java.util.List; import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter; public abstract class easyAdapter<T> extends BaseAdapter { private Context context;
private ArrayList<T> data;
private LayoutInflater inflater;
private int LayoutId;
easyViewHolder easyholder;
public easyAdapter( Context context,ArrayList<T> data,int layoutid)
{
this.context=context;
this.data=data;
inflater.from(context);
this.LayoutId=layoutid;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
} @Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
} @Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
} @Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
final easyViewHolder easyholder=getHolder(context, arg1, LayoutId, arg2);
setConverView(easyholder,data.get(arg0));//需要用户复写传值
return easyholder.getConvertView();
}
public abstract void setConverView(easyViewHolder easyViewHolder, T t);
public static easyViewHolder getHolder(Context context,View convertview,int LayoutId,ViewGroup parent)
{
return easyViewHolder.get(context, convertview, LayoutId, parent);
}
}
以上的两个类除了添加新功能不用在对其改变。
接下来我们就可以以最少的代码完成适配器:
package com.example.list_view; import java.util.ArrayList;
import java.util.List; import android.content.Context;
import android.widget.ImageView;
import android.widget.TextView; public class MyAdapter extends easyAdapter<User> { public MyAdapter(Context context, ArrayList<User> data, int layoutId) {
super(context, data, layoutId);
// TODO Auto-generated constructor stub
}
//只需在下面函数传入你所需要的值
public void setConverView(easyViewHolder myViewHolder, User t) {
// TODO Auto-generated method stub ((ImageView)myViewHolder.getView(R.id.imageview)).setImageResource(R.drawable.icon1);
((TextView)myViewHolder.getView(R.id.title)).setText(t.getTitle());
((TextView)myViewHolder.getView(R.id.text)).setText(t.getText()); } }
MainActivity的代码:
for (int i=0;i<10;i++)
{
User user=new User();
user.setIv(R.drawable.icon1);
user.setTitle("用户"+i);
user.setText("1000"+i);
list.add(user);
}
MyAdapter adapter=new MyAdapter(MainActivity.this, list, R.layout.iconlist);
list1.setAdapter(adapter);
只是单纯传入你这个listview所需要的数据源,以及传入listview的布局,便可完成各式各样的listview。
Android开发之万能适配器的更多相关文章
- Android开发进阶 -- 通用适配器 CommonAdapter
在Android开发中,我们经常会用到ListView 这个组件,为了将ListView 的内容展示出来,我们会去实现一个Adapter来适配,将Layout中的布局以列表的形式展现到组件中. ...
- android中的万能适配器BaseAdapter的总结
有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮.添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上.但是事实并非这样,因为按钮是 ...
- Android 开发笔记___spinner__适配器基础_arrayadapter
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...
- Android进阶笔记10:Android 万能适配器
1. Android 万能适配器 项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...
- 安卓开发笔记——打造万能适配器(Adapter)
为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...
- Android进阶笔记09:Android 万能适配器
1. Android 万能适配器 项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...
- android 手写万能adapter适配器
android开发中,我们离不开adapter,每个项目都有很多地方需要adapter,那么我们如何让自己少写adapter代码呢?那就是封装adapter,让我们的adapter成为万能的adapt ...
- 打造android偷懒神器———ListView的万能适配器
如果你去做任何一个项目,我相信你都会跟我有一样的经历,最最普遍的就是列表显示ListView,当然,写N个自定义的适配器也是情理之中.虽说程序员本身就是搬砖,做这些枯燥无味的重复的事情也是理所当然,但 ...
- 打造android偷懒神器———RecyclerView的万能适配器
转载请注明出处谢谢:http://www.cnblogs.com/liushilin/p/5720926.html 很不好意思让大家久等了,本来昨天就应该写这个的,无奈公司昨天任务比较紧,所以没能按时 ...
随机推荐
- linux 配置静态IP
ip配置方法是编辑sudo nano /etc/network/interfaces 树莓派默认配置 auto lo iface lo inet loopback iface eth0 inet d ...
- C 头文件阅读理解
__BEGIN_DECLS ..... ..... __END_DECLS 很多时候,为了使 C 代码和 C++ 代码保持互相兼容的过程调用接口,需要在 C++ 代码里加上 extern " ...
- FreeModbus Slave 改进的eMbPoll()【worldsing 笔记】
eMbPoll()的作用是FreeMod协议通信过程中不断查询事件对列有无完速数据桢,并进行地址和CRD验证,最后运行和回复主机. 为了减小代码尺寸对eMbPoll进行改进: 原版: 1: 2: e ...
- ORA-01078, LRM-00123错误处理
创建spfile时, 或者在nomount时, 出现下面的问题: SQL> create spfile from pfile; create spfile from pfile * ERROR ...
- 新建数据库,然后使用SQL语句创建表、存储过程、用户说明
需要在数据库的安全性,用户那里为用户设置一下权限
- Fragment详解
1 Fragment简介 1.1 Fragment的设计初衷 Android3.0引入Fragment的初衷是为大屏幕的设备提供更加灵活的动态UI设计,由于大屏设备可以容纳更多的UI组件,且这些UI组 ...
- 智能电视TV开发---客户端和服务器通信
在做智能电视应用的时候,最头疼的就是焦点问题,特别是对于个人开发者,没有设备这是最最头疼的事情了,在没有设备的情况下,怎么实现智能电视应用呢,接下来我是用TV程序来做演示的,所以接下来的所有操作是在有 ...
- C#开源资源大汇总
C#开源资源大汇总 C#开源资源大汇总 一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行 ...
- POJ3273-Monthly Expense (最小化最大值)
题目链接:cid=80117#problem/E">click here~~ [题目大意] 农夫JF在n天中每天的花费,要求把这n天分作m组.每组的天数必定是连续的.要求分得各组的花费 ...
- git克隆远程项目分支到本地对应分支
最近公司改用git了,研究了一下如何把远程的代码克隆到本地. 1. 配置对应信息 git config --global user.name git config --global user.emai ...