Android ListView万能适配器实例代码

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布局:

<?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="wrap_content"
 android:padding="10dp" >

 <CheckBox
  android:focusable="false"
  android:id="@+id/cb"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentRight="true"
  android:layout_centerInParent="true" />

 <TextView
  android:id="@+id/tv_title"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:singleLine="true"
  android:text="Android新技能 Get" />

 <TextView
  android:id="@+id/tv_desc"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_below="@id/tv_title"
  android:layout_marginTop="10dp"
  android:layout_toLeftOf="@id/cb"
  android:maxLines="2"
  android:text="Android-打造万能的ListView和GridView适配器"
  android:textColor="#898989" />

 <TextView
  android:id="@+id/tv_time"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_below="@id/tv_desc"
  android:layout_marginTop="10dp"
  android:text="2015-08-05"
  android:textColor="#898989"
  android:textSize="12sp" />

 <TextView
  android:id="@+id/tv_phone"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentRight="true"
  android:layout_below="@id/tv_desc"
  android:layout_marginTop="10dp"
  android:background="#20793D"
  android:maxLines="1"
  android:text="10086"
  android:padding="4dp"
  android:textColor="#FFF" />

</RelativeLayout>

效果图:

用这个去适配另一个不同的布局:

新布局的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:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="horizontal" >

 <TextView
  android:id="@+id/tv_item2values"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:text="ffffff"
  android:layout_margin="16dp"
  android:gravity="center" />

</LinearLayout>

效果图:

以上就是对Android ListView 的资料整理,希望能给大家带来帮助!

(0)

相关推荐

  • Android ListView适配器(Adapter)优化方法详解

    Android ListView的优化,在做Android项目的时候,在用到ListView 界面及数据显示,这个时候如果资源过大,对项目来说,用户体验肯定是不好的,这里就对如何优化做了详细介绍: Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View.想过没有? 在我们的列表有1000000项时会是什么样的?是不是会占用极大的系统资源? ListView的Adapter的作用如下图所示: 先看看下面

  • Android 中RecyclerView通用适配器的实现

    Android 中RecyclerView通用适配器的实现 前言: SDK的5.0版本出来已经N久了,可以说是已经经过许多人的检验了,里面的新控件不能说是非常完美,但也是非常好用了,其中最让我喜爱的就是RecyclerView了,可以完美替代ListView和GridView(除了添加headerview和footview了,网上有许多解决方式.这个下面会以一种简单的方式顺带解决,肯定为大家省心),而且可以代码动态切换这两种布局方式以及瀑布流布局.相关切换方式网上有很多,大家自行搜索,我就不贴连

  • Android 适配器模式应用及设计原理

    适配器模式是一种重要的设计模式,在 Android 中得到了广泛的应用.适配器类似于现实世界里面的插头,通过适配器,我们可以将分属于不同类的两种不同类型的数据整合起来,而不必去根据某一需要增加或者修改类里面的方法. 适配器又分为单向适配器和双向适配器,在 android 中前者使用的比较频繁.比较常见的实现方式是:首先定义一个适配类,内部定义一个私有的需要适配的对象,该类提供一个构造函数,将该对象的一个实例作为参数传入,并在构造函数里面进行初始化,再提供一个公有的方法,返回另外一个需要适配的类所

  • Android 通过ViewHolder优化适配器的实现方法(必看)

    Adapter类的定义: Adapter对象是AdapterView和底层数据见的桥梁.Adapter用于访问数据项,并且负责为数据项生成视图 AdapterView是一个抽象类,用于那些需要通过Adapter填充自身的视图,其常见子类是ListView.显示AdapterView时会调用Adapter的getView()方法创建并添加每个子条目的视图.Adapter的getView()方法就是用来创建这些视图的,Adapter并不会为每行数据都创建一个新视图,而是提供了回收旧视图的方法.运行机

  • Android ListView万能适配器实例代码

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的Adapter继承于BaseAdapter,下面是自定义的Adapter,精华在getView()方法中 package com.example.mylistview.util; import java.util.List; import android.content.Context; impor

  • android listview初步学习实例代码

    在android开发中ListView是比较常用的组件,下面分享一个实例. MainActivity package com.example1.listviewpracticvce; /* * 本例子实现的功能: * 用listview显示给定的一个静态数组,数组定义在string.xml中攻或者activity中 */ import android.net.sip.SipAudioCall.Listener; import android.os.Bundle; import android.a

  • 详解xamarin Android 实现ListView万能适配器

    详解xamarin Android 实现ListView万能适配器 早些时候接触xamarin Android 的列表,写了很多ListView的Adapter,建一个ListView就写一个Adapter,每一个Adapter里面还有去写一个ViewHolder的类来优化,自从看了hongyang博客的listview万能适配器的文章,学习良多,所以就写篇关于xamarin android ListView通用适配器的文章. 本章主要分为以下三点: 打造通用的ViewHolder优化ListV

  • Android 实现自定义圆形listview功能的实例代码

    最近遇到一个需求需要圆形listview作为悬浮窗,费了九牛二虎之力终于开发出来了,特别有成就感,下面分享下案例,项目原因,只能分享一部分供大家参考 1.有图有真相 下面就来讲解下代码: 1.自定义listview import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory;

  • Android 操作excel功能实例代码

    学习app对excel的读写控制 1.界面设计 <?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:id="@+id

  • Android系统音量条实例代码

    最近在定制Android系统音量条,发现代码还是蛮多的,下面总结一下. 代码是基于5.1.1版本的. 系统音量条的代码是在/frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java 布局文件是在/frameworks/base/packages/SystemUI/res/layout下. 先看看原生的音量条样式: 在代码中可以发现volume_dialog.xml这个文件,这个文件就是承载

  • Android 获取屏幕尺寸实例代码

    Android 获取屏幕尺寸实例代码 实现代码: /** * <supports-screens * android:smallScreens="true" * android:normalScreens="true" * android:largeScreens="true" * android:resizeable="true" * android:anyDensity="true" />

  • Android字段验证的实例代码

    先给大家展示效果图: package com.example.walkerlogin1; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widge

  • Android 画一个太极图实例代码

    今天练手一下,一起来画个太极图吧~ 最终效果如下: 最终效果 一般都是先讲原理,我就反其道而行,先讲实现吧. 1.继承实现初始化方法 继承View,实现基本的构造函数: public TestView(Context context) { this(context, null); } public TestView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TestView(Context c

  • Webview实现android简单的浏览器实例代码

    WebView是Android中一个非常实用的组件,它和Safai.Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面,下面通过本文给大家介绍Webview实现android简单的浏览器实例代码. 实现了浏览器的返回 前进 主页 退出 输入网址的功能 注释的很清楚啦 就不多说了 首先是布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

随机推荐