ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义。
最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家。
首先有一个自定义的Adapter继承于BaseAdapter,下面是自定义的Adapter,精华在getView()方法中
package com.example.mylistview.util;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 CommonAdapter<T> extends BaseAdapter { /** * 上下文 */ private Context mContext; /** * 实体类集合 */ private List<T> mDatas; private LayoutInflater mInflater; /** * 控件id */ private int mlayoutId; public CommonAdapter(Context context, List<T> datas, int layoutId) { this.mContext = context; this.mDatas = datas; this.mlayoutId = layoutId; mInflater = LayoutInflater.from(context); } @Override public int getCount() { // TODO Auto-generated method stub return mDatas.size(); } @Override public T getItem(int arg0) { // TODO Auto-generated method stub return mDatas.get(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 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。
以上代码中getView()方法中有一个ViewHolder是需要自己声明的,以下是代码以及详细注释:
package com.example.mylistview.util;import android.content.Context;import android.graphics.Bitmap;import android.renderscript.Type;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;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); } /** * 拿到一个ViewHolder对象 * @param context * @param convertView * @param parent * @param layoutId * @param position * @return */ 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中.
package com.example.mylistview.adapter;import java.util.List;import android.content.Context;import android.view.View;import android.view.View.OnClickListener;import android.widget.CheckBox;import com.example.mylistview.R;import com.example.mylistview.domain.Bean;import com.example.mylistview.util.CommonAdapter;import com.example.mylistview.util.ViewHolder;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()); } }); } }}
优化之后用适配器的时候就简单多了下面是实体类,item和MainActivity.java中的代码:
实体类:
package com.example.mylistview.domain;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.java:
重点代码:
参数有上下文,集合,和自己对应的item就可以了
adapter = new MyAdapter(this, mDatas, R.layout.item);
package com.example.mylistview.ui;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import com.example.mylistview.R;import com.example.mylistview.adapter.MyAdapter;import com.example.mylistview.domain.Bean;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(); } 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("捡到权志龙一个", "在星巴克捡到权志龙一个", "2015-08-06", "10086"); mDatas.add(bean); bean = new Bean("GetTOP一个", "在韩国首尔捡到TOP一个", "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布局:
<?
效果图:
images/loading.gif' data-original="data:image/png;base64,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
用这个去适配另一个不同的布局:
新布局的Adapter一样继承自己的万能adapter:CommonAdapter
package com.example.mylistview.adapter;import java.util.List;import java.util.Map;import android.content.Context;import com.example.mylistview.R;import com.example.mylistview.util.CommonAdapter;import com.example.mylistview.util.ViewHolder;public class SecondAdapter extends CommonAdapter<Map<String, String>> { public SecondAdapter(Context context, List<Map<String, String>> datas, int layoutId) { super(context, datas, layoutId); // TODO Auto-generated constructor stub } @Override public void convert(ViewHolder holder, Map<String, String> t) { // TODO Auto-generated method stub holder.setText(R.id.tv_item2values, t.get("values")); }}
Activity.java代码:
package com.example.mylistview.ui;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;import com.example.mylistview.R;import com.example.mylistview.adapter.MyAdapter;import com.example.mylistview.adapter.SecondAdapter;public class SecondActivity extends Activity { private ListView listView_second; private SecondAdapter secondAdapter; private List<Map<String, String>> lists = new ArrayList<Map<String, String>>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); initView(); initData(); } private void initData() { // TODO Auto-generated method stub for (int i = 0; i < 4; i++) { Map map = new HashMap<String, String>(); map.put("values", "条目" + i); lists.add(map); } secondAdapter = new SecondAdapter(this, lists, R.layout.item2); listView_second.setAdapter(secondAdapter); } private void initView() { // TODO Auto-generated method stub listView_second = (ListView) findViewById(R.id.listView_second); }}
item:
<?
效果图:
备忘,希望能给大家带来帮助。
原标题:Android—万能ListView适配器
关键词:Android