Android中的自定义Adapter(继承自BaseAdapter)——与系统Adapter的调用方法一致——含ViewHolder显示效率的优化
来源:互联网 发布:新菜鸟网络俱乐部 编辑:程序博客网 时间:2024/05/21 10:18
转自 http://blog.csdn.net/listening_music/article/details/6965755
Android中很多地方使用的是适配器(Adapter)机制,那我们就要好好把这个Adapter利用起来,并且用出自己的特色,来符合我们自行设计的需要喽~~~
下面先上一个例子,是使用ViewHolder进行显示效率优化过的工程:
- package com.test.listviewsimpleadapter;
-
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- import android.app.AlertDialog;
- import android.app.ListActivity;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.ListView;
- import android.widget.TextView;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public class MyListView4 extends ListActivity {
-
- private List<Map<String, Object>> mData;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mData = getData();
- MyAdapter adapter = new MyAdapter(this);
- setListAdapter(adapter);
- }
-
- private List<Map<String, Object>> getData() {
- List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
-
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("title", "G1");
- map.put("info", "google 1");
- map.put("img", R.drawable.i1);
- list.add(map);
-
- map = new HashMap<String, Object>();
- map.put("title", "G2");
- map.put("info", "google 2");
- map.put("img", R.drawable.i2);
- list.add(map);
-
- map = new HashMap<String, Object>();
- map.put("title", "G3");
- map.put("info", "google 3");
- map.put("img", R.drawable.i3);
- list.add(map);
-
- return list;
- }
-
-
- @Override
- protected void onListItemClick(ListView l, View v, int position, long id) {
- Log.v("MyListView4-click", (String) mData.get(position).get("title"));
- }
-
-
-
-
- public void showInfo() {
- new AlertDialog.Builder(this).setTitle("我的listview")
- .setMessage("介绍...")
- .setPositiveButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- }
- }).show();
- }
-
- public final class ViewHolder {
- public ImageView img;
- public TextView title;
- public TextView info;
- public Button viewBtn;
- }
-
- public class MyAdapter extends BaseAdapter {
-
- private LayoutInflater mInflater;
-
- public MyAdapter(Context context) {
- this.mInflater = LayoutInflater.from(context);
- }
-
- @Override
- public int getCount() {
-
- return mData.size();
- }
-
- @Override
- public Object getItem(int arg0) {
-
- return null;
- }
-
- @Override
- public long getItemId(int arg0) {
-
- return 0;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
-
-
- ViewHolder holder = null;
- if (convertView == null) {
-
- holder = new ViewHolder();
-
- convertView = mInflater.inflate(R.layout.main, null);
-
- holder.img = (ImageView) convertView.findViewById(R.id.img);
- holder.title = (TextView) convertView.findViewById(R.id.title);
- holder.info = (TextView) convertView.findViewById(R.id.info);
- holder.viewBtn = (Button) convertView
- .findViewById(R.id.view_btn);
- convertView.setTag(holder);
-
- } else {
-
- holder = (ViewHolder) convertView.getTag();
- }
-
- holder.img.setBackgroundResource((Integer) mData.get(position).get(
- "img"));
- holder.title.setText((String) mData.get(position).get("title"));
- holder.info.setText((String) mData.get(position).get("info"));
-
- holder.viewBtn.setOnClickListener(new View.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- showInfo();
- }
- });
- return convertView;
- }
- }
- }
下面是将自定义的Adapter的构造方法定义为与系统的Adapter一致的工程,这样大家在实例化自定义的Adapter时可以按照实例化系统的Adapter的参数安排来进行哟~
- package com.test.listviewsimpleadapter;
-
- import java.util.List;
- import java.util.Map;
- import android.app.AlertDialog;
- import android.content.Context;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.CheckBox;
- import android.widget.CompoundButton;
- import android.widget.ImageView;
- import android.widget.TextView;
- import android.widget.CompoundButton.OnCheckedChangeListener;
-
-
-
-
- public class MySimpleAdapter extends BaseAdapter {
- private LayoutInflater mInflater;
- private List<Map<String, Object>> list;
- private int layoutID;
- private String flag[];
- private int ItemIDs[];
- public MySimpleAdapter(Context context, List<Map<String, Object>> list,
- int layoutID, String flag[], int ItemIDs[]) {
- Log.i("TAG","构造方法");
- this.mInflater = LayoutInflater.from(context);
- this.list = list;
- this.layoutID = layoutID;
- this.flag = flag;
- this.ItemIDs = ItemIDs;
- }
- @Override
- public int getCount() {
-
- return list.size();
- }
- @Override
- public Object getItem(int arg0) {
-
- return 0;
- }
- @Override
- public long getItemId(int arg0) {
-
- return 0;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- convertView = mInflater.inflate(layoutID, null);
- for (int i = 0; i < flag.length; i++) {
- if (convertView.findViewById(ItemIDs[i]) instanceof ImageView) {
- ImageView iv = (ImageView) convertView.findViewById(ItemIDs[i]);
- iv.setBackgroundResource((Integer) list.get(position).get(
- flag[i]));
- } else if (convertView.findViewById(ItemIDs[i]) instanceof TextView) {
- TextView tv = (TextView) convertView.findViewById(ItemIDs[i]);
- tv.setText((String) list.get(position).get(flag[i]));
- }else{
-
- Log.i("TAG","else");
- }
- }
- addListener(convertView);
- return convertView;
- }
-
-
-
-
-
- public void addListener(View convertView) {
- ((Button)convertView.findViewById(R.id.btn)).setOnClickListener(
- new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- new AlertDialog.Builder(LvSimpleAdapter.ma)
- .setTitle("自定义通用SimpleAdapter")
- .setMessage("按钮成功触发监听事件!")
- .show();
- Log.i("TAG","Button");
- }
- });
- ((CheckBox)convertView.findViewById(R.id.cb)).
- setOnCheckedChangeListener(new OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- new AlertDialog.Builder(LvSimpleAdapter.ma)
- .setTitle("自定义通用SimpleAdapter")
- .setMessage("CheckBox成功触发状态改变监听事件!")
- .show();
- Log.i("TAG","CheckBox");
- }
- });
- }
- }
以上代码的注释都比较详细,而且前面的Blog中也对Adapter进行过讲解,这边就不再说一遍啦~ 其中第二段代码中没有使用ViewHolder对显示效率进行优化,大家可以参考第一段稍稍改动一下就OK了哈~
0 0