通用的Adapter

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/lv_main_apps"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </ListView>
</LinearLayout>

item_app.xml

<?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="70dp"
    android:minHeight="70dp"
    android:orientation="horizontal"
    android:gravity="center_vertical">

    <ImageView
        android:id="@+id/iv_item_icon"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv_item_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>

AppInfo

package com.example.app3_listview;

import android.graphics.drawable.Drawable;

public class AppInfo {

	private Drawable icon;
	private String appName;
	private String packageName;

	public AppInfo(Drawable icon, String appName, String packageName) {
		super();
		this.icon = icon;
		this.appName = appName;
		this.packageName = packageName;
	}

	public AppInfo() {
		super();
	}

	public Drawable getIcon() {
		return icon;
	}

	public void setIcon(Drawable icon) {
		this.icon = icon;
	}

	public String getAppName() {
		return appName;
	}

	public void setAppName(String appName) {
		this.appName = appName;
	}

	public String getPackageName() {
		return packageName;
	}

	public void setPackageName(String packageName) {
		this.packageName = packageName;
	}

	@Override
	public String toString() {
		return "AppInfo [icon=" + icon + ", appName=" + appName
				+ ", packageName=" + packageName + "]";
	}

}

MainActivity

package com.example.app3_listview;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import com.example.adapter.base.CommonBaseAdapter;
import com.example.adapter.base.ViewHolder;

public class MainActivity extends Activity {

	private ListView lv_main_apps;
	private List<AppInfo> data;
	private MyAdapter adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 加载视图--只有一个listview
		setContentView(R.layout.activity_main);
		// 获取id
		lv_main_apps = (ListView) findViewById(R.id.lv_main_apps);

		// 得到数据
		data = getAllAppInfos();

		// 创建adapter
		adapter = new MyAdapter(this, data, R.layout.item_app);

		// 设置adapter显示
		lv_main_apps.setAdapter(adapter);

		// 设置每项(item)的点击监听
		lv_main_apps
				.setOnItemClickListener(new AdapterView.OnItemClickListener() {
					@Override
					public void onItemClick(AdapterView<?> parent, View view,
							int position, long id) {// position 点击的下标
						// 得到数据
						AppInfo appInfo = data.get(position);
						String appName = appInfo.getAppName();
						// 显示
						Toast.makeText(MainActivity.this, appName, 0).show();
					}
				});
	}

	/*
	 * 得到手机中所有应用信息的列表 AppInfo
	 */
	protected List<AppInfo> getAllAppInfos() {

		List<AppInfo> list = new ArrayList<AppInfo>();
		// 得到应用的packgeManager
		PackageManager packageManager = getPackageManager();
		// 创建一个主界面的intent
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_MAIN);
		intent.addCategory(Intent.CATEGORY_LAUNCHER);
		// 得到包含应用信息的列表
		List<ResolveInfo> ResolveInfos = packageManager.queryIntentActivities(
				intent, 0);
		// 遍历
		for (ResolveInfo ri : ResolveInfos) {
			// 得到包名
			String packageName = ri.activityInfo.packageName;
			// 得到图标
			Drawable icon = ri.loadIcon(packageManager);
			// 得到应用名称
			String appName = ri.loadLabel(packageManager).toString();
			// 封装应用信息对象
			AppInfo appInfo = new AppInfo(icon, appName, packageName);
			// 添加到list
			list.add(appInfo);
		}
		return list;
	}

	/**
	 * 继承自CommonBaseAdapter的adapter类
	 */
	class MyAdapter extends CommonBaseAdapter<AppInfo> {

		public MyAdapter(Context context, final List<AppInfo> data, int layoutId) {
			super(context, data, layoutId, new Convert() {
				@Override
				public void convert(ViewHolder holder, int position) {

					AppInfo appInfo = data.get(position);
					holder.setText(R.id.tv_item_name, appInfo.getAppName()).setImageDrawable(R.id.iv_item_icon,appInfo.getIcon());
				}
			});
		}

	}
}

CommonBaseAdapter

package com.example.adapter.base;

import java.util.List;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

/**
 * 通用的baseAdapter
 */
public abstract class CommonBaseAdapter<T> extends BaseAdapter {

	private Context context;
	private List<T> data;
	private int layoutId;
	public Convert convert;

	/**
	 * 设置视图数据的抽象方法, 由具体的adapter子类来实现
	 */
	public interface Convert{
		void convert(ViewHolder holder, int position);
	}
	public CommonBaseAdapter(Context context, List<T> data, int layoutId,Convert convert) {
		this.context = context;
		this.data = data;
		this.layoutId = layoutId;
		this.convert = convert;
	}

	@Override
	public int getCount() {
		return data.size();
	}

	@Override
	public T getItem(int position) {
		return data.get(position);
	}

	@Override
	public long getItemId(int position) {
		return 0;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		//得到Viewholder对象
		ViewHolder holder = ViewHolder.getHolder(context, convertView,
				layoutId);
		//调用未实现的抽象方法设置数据
		convert.convert(holder, position);
		//返回holder中的convertView
		return holder.getConvertView();
	}

}

ViewHolder

package com.example.adapter.base;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.SparseArray;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * 通用的ViewHolder类
 */
public class ViewHolder {

	// 代表当前行的view对象
	private View itemConvertView;
	// 用来替代Map<Integer,Object>的容器, 效率比map高
	private SparseArray<View> views;

	/*******************************************************************
	 * 得到ViewHolder对象 context--layoutId:这个是用来构造时候,需要动态加载布局文件
	 * convertview:是可复用的item布局
	 */
	public static ViewHolder getHolder(Context context, View convertView,
			int layoutId) {
		/**
		 * 如果没有可复用的布局,就创建本类对象 如果有的话,就通过getTag获取
		 * */
		if (convertView == null) {
			return new ViewHolder(context, layoutId);
		} else {
			ViewHolder holder = (ViewHolder) convertView.getTag();
			return holder;
		}
	}

	/**
	 * 构造方法 加载布局文件,将本类标记即viewholder保存到itemConvertView中
	 */
	private ViewHolder(Context context, int layoutId) {
		this.itemConvertView = View.inflate(context, layoutId, null);
		this.itemConvertView.setTag(this);
		views = new SparseArray<View>();
	}

	/**
	 * 得到当前对应的convertView
	 */
	public View getConvertView() {
		return itemConvertView;
	}

	/*************************
	 * %%%%%%%%%%%%******************************** 根据视图id得到对应的视图对象
	 */
	public <T extends View> T getView(int viewId) {
		View view = views.get(viewId);
		if (view == null) {
			view = itemConvertView.findViewById(viewId);
			views.put(viewId, view);
		}
		return (T) view;
	}

	//

	/**
	 * 设置文本数据
	 */
	public ViewHolder setText(int viewId, String text) {
		TextView textView = getView(viewId);
		textView.setText(text);
		return this;
	}

	/**
	 * 设置drawable图片
	 */
	public ViewHolder setImageDrawable(int viewId, Drawable drawable) {
		ImageView imageView = getView(viewId);
		imageView.setImageDrawable(drawable);
		return this;
	}

	/**
	 * 设置资源图片
	 */
	public ViewHolder setImageResource(int viewId, int resourceId) {
		ImageView imageView = getView(viewId);
		imageView.setImageResource(resourceId);
		return this;
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 14:11:07

通用的Adapter的相关文章

通用Adapter与ListView滚动时不加载图片的封装

本文原创,转载请注明链接:http://blog.kymjs.com/ 在Android开发中写Adapter是一件非常麻烦的事情,枯燥重复,却又不得不去做. 对于Adapter一般都继承BaseAdapter复写几个方法,getView里面使用ViewHolder存储,其实大部分的代码都是类似的.那么本文就带大家一起做一次将Adapter封装成一个通用的Adapter. 关于本文的完整Demo,可以参考KJFrameForAndroid开发框架2.2版本中封装的实例,KJAdapter和Ada

打造万能Adapter(适配器)——适用于ListView、GridListView

整理总结自鸿洋的博客:http://blog.csdn.net/lmj623565791/article/details/38902805/ 一.利用普通的Adapter实现ListView列表--这是最基础的适配器 以下代码是最普通的实现方法: 1.MainActiviy.java public class MainActivity extends Activity { private List<String> mData = new ArrayList<String>(Arra

安卓开发笔记——打造万能适配器(Adapter)

为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需要,因此我们时常要去继承BaseAdapter类去实现一个自定义的适配器来满足我们的场景需要. 如果你是开发一个简单点的APP还好,可能ListView和GridView的数量不会太多,我们只要去写几个BaseAdapter实现类就可以了. 但如果有一天,你需要开发一个APP里面具有几十个ListV

android-ViewList的通用ViewHold

在写ViewList的时候要写Adapter的时候,经常大量的代码都是差不多的. 1 ViewHold 2 if(convertView ==null ){}else{} 3 setTag 4 FIndElement 和 Set 等等 所以我想能不能写一个通用的ViewHold的和通用的Adapter呢? 我们来试试吧. 直接上代码,然后再进行分析. <?xml version="1.0" encoding="utf-8"?> <LinearLay

封装能重用的自定义Adapter,向翔哥致敬

看了翔哥的自定义万能的adapter,自己也做下笔记,分析一下高手的思维方式,让我们一起进入变态程序员的内心世界. 分析万能的adapter之前,我们先分析一下普通的adapter public class ReportSpinnerAdapter extends BaseAdapter { private Context context; private List<String> str; public ReportSpinnerAdapter(Context context, List&l

android 练习之路 (五)

项目的github地址:https://github.com/Qunter/SearchAndCall ------------------------------------------------------------------------ 之前几天因为竞赛一直没做,得,今天开始接着完成这玩意 上次把架子给搭好了,今天开始就要填内容了,那么我们就从左往右依次做吧 首先是学校资讯界面 还是老规矩,先上效果图 那么可以看到主要是有两个地方有改变,第一个是标题栏随着fragment的切换而改变

Android-进一步封装ViewHolder

当我们在使用ListView或者GridView时,通常需要一个Adapter,而这个Adapter通常会继承BaseAdapter,在自定义的Adapter里面会使用ViewHolder来提高程序的效率.传统的ViewHolder模式使得程序能够提高一定的效率, 而今天我将记录一下怎么进一步的封装Adapter,使得更加的通用 -- 来自慕课网的学习 原始ViewHolder和Adapter的写法: 1 package com.example.android_commonadapter; 2

Android 快速开发系列 打造万能的ListView GridView 适配器

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38902805 ,本文出自[张鸿洋的博客] 1.概述 相信做Android开发的写得最多的就是ListView,GridView的适配器吧,记得以前开发一同事开发项目,一个项目下来基本就一直在写ListView的Adapter都快吐了~~~对于Adapter一般都继承BaseAdapter复写几个方法,getView里面使用ViewHolder模式,其实大部分的代码基本都是类似的

【踩坑必备】这可能是你想知道的圈子赞和互评实现逻辑思路~

一.写在前面 现在可以说各大App都集成了社区功能,一条主贴,几条评论,几张美图,点赞,反对,嗨不停. 这不,最近一个即将答辩的毕业生(下周答辩)让我有偿帮他实现一个赞和评论发布动态的功能,说是看不太明白我的开源毕业设计:https://github.com/nanchen2251/AiYaSchoolPush,无奈我实在是有些太忙,也琢磨着好些日子没有更新博客,这里就结合一个实际项目做一下讲解,姑且做个抛砖引玉吧. 因为这毕竟是个人思路,难免会有不足之处,不过的确是能实现功能.有更好的或者别样