ListView_适配器之万能适配器_实现多个ListView公用同一个适配器

42 篇文章 1 订阅
21 篇文章 0 订阅
    相信接触过开发的人一定会接触ListView,相信接触过ListView的人一定接触过BaseAdapter,相信接触过BaseAdapter的人一定很痛恨编写适配器,因为它的数量往往跟ListView的总数是成正比的,所以我今天给大家介绍一款神器,万能适配器!
    在自定义适配器的时候,我们通常会自定义一个ViewHolder类,虽然这个名字是随便起的,但是就像约定俗成一样,我们还是这么用了这么多年!当然,自定义万能适配器,从它-ViewHolder开始,我们把所有与ViewHolder有关的操作都封装起来,这样在我们的适配器中,getView中的操作就会简单很多。
   
   
package com.ctgu.adapter;
 
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
 
public class ViewHolder {
private SparseArray<View> mView;
private int mPosition;
private View mConvertView;
/**
* 参数说明
* @param context 上下文
* @param parent ViewGroup
* @param layoutId 布局文件
* @param position 当前position
*/
public ViewHolder(Context context, ViewGroup parent, int layoutId,
int position) {
this.mPosition = position;
this.mView = new SparseArray<View>();
mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
false);
mConvertView.setTag(this);
}
/**
* @param context
* @param convertView
* @param parent
* @param layoutId
* @param position
* @return 返回一个ViewHolder
*/
public static ViewHolder get(Context context, View convertView,
ViewGroup parent, int layoutId, int position) {
if (convertView == null) {
return new ViewHolder(context, parent, layoutId, position);
} else {
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.mPosition = position;
return holder;
}
}
 
/*
* 通过viewId获取控件
*/
public <T extends View> T getView(int viewId) {
View view = mView.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
mView.put(viewId, view);
}
return (T) view;
}
/**
* 返回视图
* @return
*/
public View getmConvertView() {
return mConvertView;
}
}
然后我们自定义自己的万能适配器
   
   
package com.example.day19_viewholder;
 
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 CommonAdapters<T> extends BaseAdapter {
protected Context context;
protected List<T> list;
protected LayoutInflater inflater;
protected int layoutid;
public CommonAdapters(Context context, List<T> list,int layoutid) {
this.context = context;
this.inflater = LayoutInflater.from(context);
this.list = list;
this.layoutid = layoutid;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list==null?0:list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list==null?null:list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder = ViewHolder.get(context, convertView, parent,
layoutid, position);
convert(holder, getItem(position));
return holder.getmConvertView();
}
public abstract void convert(ViewHolder holder,Object t);
}
    其中,我们对外提供一个方法让调用者对控件进行获取并赋值操作。
    这样就两个类就完成了万能适配器的制作,下面我们来使用下!
    下面是MainAdapter.java
   
   
package com.example.day19_viewholder;
 
import java.util.List;
 
import android.content.Context;
import android.widget.TextView;
 
public class MyAdapter extends CommonAdapters<Jokes>{
public MyAdapter(Context context, List<Jokes> list) {
super(context, list,R.layout.listview_item_jokes);
// TODO Auto-generated constructor stub
}
 
@Override
public void convert(ViewHolder holder, Object t) {
Jokes joke = (Jokes) t;
((TextView)holder.getView(R.id.tv_jokes_title)).setText(joke.getTitle());
((TextView)holder.getView(R.id.tv_jokes_time)).setText(joke.getTime());
((TextView)holder.getView(R.id.tv_jokes_source)).setText(joke.getSource());
((TextView)holder.getView(R.id.tv_jokes_content)).setText(joke.getContent());
}
}
    下面是MainActivity.java
   
   
package com.example.day19_viewholder;
 
import java.util.ArrayList;
import java.util.List;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;
 
public class MainActivity extends Activity {
private ListView listview;
private MyAdapter adapter;
private List<Jokes> list;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.id_lv);
list = new ArrayList<Jokes>();
//添加数据
for (int i = 0; i < 10; i++) {
Jokes j = new Jokes("title"+i, "土豆", "2015/9/8", "你是可爱的小苹果");
list.add(j);
}
adapter = new MyAdapter(this, list);
listview.setAdapter(adapter);
}
 
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
    下面是Jokes.java
   
   
package com.example.day19_viewholder;
 
public class Jokes {
private String title;
private String source;
private String time;
private String content;
public Jokes() {
// TODO Auto-generated constructor stub
}
public Jokes(String title, String source, String time, String content) {
super();
this.title = title;
this.source = source;
this.time = time;
this.content = content;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
    最后附上效果图,说明是没有问题的,哈哈!

     最后附上源码下载地址,当然是不需要积分就可以下载的,知识就是要分享嘛!
    源码下载地址:http://download.csdn.net/detail/u010998327/9114647
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值