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;
}
}

通用的Adapter的更多相关文章

  1. RecyclerView高速通用适配Adapter

    RecyclerView Adapter 为RecyclerView提供更简单的适配器实现方式,不断更新完好中. Demo视频演示 GitHub地址 博客 使用 BaseViewHolder 的使用 ...

  2. 设计通用的Adapter

    2019年3月18日 10:53:27 参照博文:Android 快速开发系列 打造万能的ListView GridView 适配器 一 BaseViewHolder public class Bas ...

  3. 为RecyclerView打造通用Adapter

    ##RecycleView简单介绍 RecyclerView控件和ListView的原理有非常多相似的地方,都是维护少量的View来进行显示大量的数据.只是RecyclerView控件比ListVie ...

  4. 为RecyclerView打造通用Adapter 让RecyclerView更加好用

    原文出处: 张鸿洋 (Granker,@鸿洋_ ) 一.概述 记得好久以前针对ListView类控件写过一篇打造万能的ListView GridView 适配器,如今RecyclerView异军突起, ...

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

    为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需 ...

  6. ListView ,GridView 通用适配器

    前言 接近半年的时间没有写博客了,今年公司的项目有点多,比较忙,没时间写,这是其一.其次是,这半年来,有时间的时候,我都会看看自己以前写的博客,也许是以前刚刚写博客,经验不足,感觉写出来的博客质量很不 ...

  7. android-ViewList的通用ViewHold

    在写ViewList的时候要写Adapter的时候,经常大量的代码都是差不多的. 1 ViewHold 2 if(convertView ==null ){}else{} 3 setTag 4 FIn ...

  8. 59.Android开源项目及库 (转)

    转载 : https://github.com/Tim9Liu9/TimLiu-Android?hmsr=toutiao.io&utm_medium=toutiao.io&utm_so ...

  9. 打造万能的ListView GridView 适配器

    转载:http://blog.csdn.net/lmj623565791/article/details/38902805/ 通用的ViewHolder 首先分析下ViewHolder的作用,通过co ...

随机推荐

  1. 关于WIN7开始“搜索程序和文件”

    大家好,我是WIN7使用者.关于WIN7开始>搜索程序和文件,这点功能强大,但是本人电脑水平不好,几乎不怎么会用. 我知道可以找出相应的软件,但是我想知道的是,可以找出电脑相应的功能,到某个界面 ...

  2. JMeter在linux上分布式压测遇到的坑(三)

    master和slave机要在同一网段内,才能做分布式(Jmeter要配环境变量,这样不用手动起server) 分布式不成功,解决方案: 1.master端和slave端要ping通 2.ping通后 ...

  3. day14-二分法、匿名函数、内置函数以及面向过程编程

    目录 二分法 匿名函数 内置函数 面向过程编程 二分法 二分法查找适用于数据量较大时,但是数据需要先排好顺序.主要思想是:(设查找的数组区间为array[low, high]) (1)确定该区间的中间 ...

  4. luogu P3899 [湖南集训]谈笑风生 线段树合并

    Code: #include<bits/stdc++.h> #define maxn 300002 #define ll long long using namespace std; vo ...

  5. Linux安装redis并且连接内网的redis

    1.安装redis步骤 1.首先准备工作  [root@10-100-14-130 ~]# yum install gcc-c++   yum install wget 2.推荐进入到linux路径/ ...

  6. nfs服务权限配置

    nfs服务权限配置 1. 查看系统是否已经安装了服务Rpm -qa | grep nfs 2. 启动服务,并且开机自动运行Systemctl start nfsSystemctl enabled nf ...

  7. UVA - 10048 Audiophobia(Floyd求路径上最大值的最小)

    题目&分析: 思路: Floyd变形(见上述紫书分析),根据题目要求对应的改变判断条件来解题. 代码: #include <bits/stdc++.h> #define inf 0 ...

  8. Python学习笔记(2)数值类型

    进制转换 int函数任意进制转换为10进制 第一个参数传入一个字符串,任意进制的,第二个参数传入对这个字符串的解释,解释他为几进制 hex oct bin转换进制为16 8 或者2进制 例题中石油87 ...

  9. apacheAB测试指标

    在进行性能测试过程中有几个指标比较重要: 1.吞吐率(Requests per second) 服务器并发处理能力的量化描述,单位是reqs/s,指的是在某个并发用户数下单位时间内处理的请求数.某个并 ...

  10. python_ 学习笔记(基本数据类型)

    python3有6中标准数据类型:Number(数字).String(字符串).List(列表).Tuple(元组).Dictionary(字典).Set(集合)不可变数据:Number.String ...