Android之BaseAdapter的优雅实现
在android的开发过程中,我们不可避免的要使用ListView来展示我们的Activity上面的内容。你可以使用很多种方式来实现这一功能,但是如何优雅快速的来实现呢?这就是我要写的了,既为了大家共同进步,也为了以后自己复习方便。话不多说,上代码吧。
首先要在main_activity.xml 文件中写好我们的布局文件其实也就是一个ListView,然后是对于其内每一个Item,我们要展示的布局样式,如item.xml:
"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageview"
android:layout_width="100dp"
android:layout_height="60dp"
android:background="#FFADAD"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/title"
android:layout_width="240dp"
android:layout_height="30dp"
android:layout_toRightOf="@+id/imageview"
android:background="#AAAAAA"
android:text="Title"
android:gravity="center" />
<TextView
android:id="@+id/content"
android:text="Content"
android:layout_width="240dp"
android:layout_height="40dp"
android:layout_below="@+id/title"
android:layout_toRightOf="@+id/imageview"
android:background="#F0000F" />
</RelativeLayout>
然后对应此xml文件,我们需要声明一个bean的方式的java文件,用来封装对应的资源:
package com.example.testproject;
public class ItemBean {
private int ItemImageView;
private String ItemTitle;
private String ItemContent;
public int getItemImageView() {
return ItemImageView;
}
public void setItemImageView(int itemImageView) {
ItemImageView = itemImageView;
}
public String getItemTitle() {
return ItemTitle;
}
public void setItemTitle(String itemTitle) {
ItemTitle = itemTitle;
}
public String getItemContent() {
return ItemContent;
}
public void setItemContent(String itemContent) {
ItemContent = itemContent;
}
public ItemBean(int itemImageView, String itemTitle, String itemContent) {
ItemImageView = itemImageView;
ItemTitle = itemTitle;
ItemContent = itemContent;
}
}
//其中需要注意的是构造函数中含有全部的参数
下面就是BaseAdapter的实现类了,为了代码的复用,我把BaseAdapter封装了起来,方便维护和修改,内部包含三个方式,我最推崇的是没有被注释的那个,代码如下:
package com.example.testproject;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
@SuppressLint("InflateParams") public class MyAdapter extends BaseAdapter {
private List<ItemBean>mList;
private LayoutInflater mInflater;
public MyAdapter(Context context,List<ItemBean> list){
mList=list;
mInflater=LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mList.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return mList.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int arg0, View convertView, ViewGroup arg2) {
//Method1:没有用到后面的参数,没有缓存机制每次都是冲更新生成,资源利用度不够高
// View view =mInflater.inflate(R.layout.item, null);
// ImageView imageView=(ImageView)view.findViewById(R.id.imageview);
// TextView title=(TextView)view.findViewById(R.id.title);
// TextView content=(TextView)view.findViewById(R.id.content);
// ItemBean bean=mList.get(arg0);
// imageView.setImageResource(bean.getItemImageView());
// title.setText(bean.getItemTitle());
// content.setText(bean.getItemContent());
// return view;
//Method1 _end;
//普通式:利用了ListView的缓存机制,避免了每次都创建ListView
// if(convertView==null){
// convertView=mInflater.inflate(R.layout.item, null);
// }
// ImageView imageView=(ImageView)convertView.findViewById(R.id.imageview);
// TextView title=(TextView)convertView.findViewById(R.id.title);
// TextView content=(TextView)convertView.findViewById(R.id.content);
// ItemBean bean=mList.get(arg0);
// imageView.setImageResource(bean.getItemImageView());
// title.setText(bean.getItemTitle());
// content.setText(bean.getItemContent());
//
// return convertView;
//普通式结束
//文艺式:避免用findViewById()方法
ViewHolder viewHolder;
if(convertView==null){
viewHolder=new ViewHolder();
convertView=mInflater.inflate(R.layout.item, null);
viewHolder.imageView=(ImageView)convertView.findViewById(R.id.imageview);
viewHolder.title=(TextView)convertView.findViewById(R.id.title);
viewHolder.content=(TextView)convertView.findViewById(R.id.content);
convertView.setTag(viewHolder);
}else{
viewHolder=(ViewHolder)convertView.getTag();
}
ItemBean bean=mList.get(arg0);
viewHolder.imageView.setImageResource(bean.getItemImageView());
viewHolder.title.setText(bean.getItemTitle());
viewHolder.content.setText(bean.getItemContent());
return convertView;
}
class ViewHolder{
public ImageView imageView;
public TextView title;
public TextView content;
}
}
//最后的内部类仅仅是第三个方法才会用的到的。
最后就是在MainActivity中添加实现了。代码如下:
package com.example.testproject;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.ListView;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<ItemBean>itemBeanList=new ArrayList<ItemBean>();
for(int i=0;i<=20;i++){
itemBeanList.add(new ItemBean(
R.drawable.ic_launcher,
"Title"+i,"Content"+i*i
));
}
ListView listView=(ListView)findViewById(R.id.listview);
listView.setAdapter(new MyAdapter(this,itemBeanList));
}
}
好了,代码就是这样了,然后看一下程序的效果图吧(界面没有修改,比较难看,望见谅)。
Android之BaseAdapter的优雅实现的更多相关文章
- android.widget.BaseAdapter调用DataSetObservable.notifyChanged/Invalidated
在android.widget.BaseAdapter类中定义了两个notifyDataXXX方法. public void notifyDataSetChanged() { mDataSet ...
- Android退出应用最优雅的方式(改进版)
Android退出应用最优雅的方式(改进版)(转) 我们先来看看几种常见的退出方法(不优雅的方式) 一.容器式 建立一个全局容器,把所有的Activity存储起来,退出时循环遍历finish所有Act ...
- Android笔记——BaseAdapter的使用
Android中的适配器(Adapter)是数据与视图(View)之间的桥梁,用于对要显示的数据进行处理,并通过绑定到组件进行数据的显示. BaseAdapter是Android应用程序中经常用到的基 ...
- [Android]对BaseAdapter中ViewHolder编写简化
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3642849.html 在Android项目中,经常都会用到Li ...
- android ArrayAdapter BaseAdapter SimpleAdapter使用讲解
不是我针对谁,我只想针对新手玩家. 不清楚Adapter作用的可以看一下http://www.cnblogs.com/zhichaobouke/p/5798672.html (括号里的内容都是我主观添 ...
- Android技能杂谈——如何优雅的处理控件的点击事件
首先分享一个最佳实践: 大家开发复杂一些的Android应用的时候常常会写一个BaseActivity或者BaseFragment,里面写上一些基本而公用的方法,比如监听网络状况.弹出对话框.设置ac ...
- Android Studio美化之优雅的logcat
博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园: 追风917 先来个图,图样吐sexy: 很简单,跟我走吧,两步: 1. 引入Logger库 首先,这个sexy ...
- android 适配器 BaseAdapter 的学习
昨天晚上看了下ArrayAdapter,和SimpleAdapter,今天早上起来看完了球赛,又继续要开始学习了,适配器除了前面的两种,还有一种常用的就是BaseAdapter,他是一个抽象类.事实上 ...
- [Android]对BaseAdapter中ViewHolder编写简化(转)
来自博客:http://www.cnblogs.com/tiantianbyconan/p/3642849.html 在Android项目中,经常都会用到ListView这个控件,而相应的Adapte ...
随机推荐
- C# ref与out
ref参数是引用,out参数为输出参数.我写一个控制台的程序来说明一下两者的特点和区别: class Program { 3 public static void RefMethod( ref int ...
- 原生Js写轮播图代码
html css js 在知道jQuery如何实现轮播效果的基础上,用js写代码 如图:标记这里的地方 理解一下 用到的知识: 1.HTML DOM 的appendChild() 和 removeCh ...
- Node.js 全局对象介绍
全局对象 这些对象在所有模块里都可用.有些对象不是在全局作用域而是在模块作用域里,这些情况下面文档都会标注出来. global {Object} 全局命名空间对象. 浏览器里,全局作用域就是顶级域.如 ...
- MongoDB 数据库引用
MongoDB 引用有两种: 手动引用(Manual References) DBRefs DBRefs vs 手动引用 考虑这样的一个场景,我们在不同的集合中 (address_home, addr ...
- Docker命令查询
基本语法 docker [OPTIONS] COMMAND [arg...] 一般来说,Docker 命令可以用来管理 daemon,或者通过 CLI 命令管理镜像和容器.可以通过 man docke ...
- 工作流引擎 Flowable 6.0.0.RC1 release,完全兼容Activi
Flowable 6.0.0.RC1 release,第一个可流动的6引擎版本(6.0.0.RC1). Flowable 6.0.0.RC1 relase新增加的功能以及特色: 包重命名为org.Fl ...
- GDAL创建图像提示Driver xxx does not support XXX creation option的原因
经常在群里有人问,创建图像的时候为什么老是提示下面的信息. CPLError: Driver GTiff does not support DCAP_CREATE creation option Wa ...
- Android的Spinner控件用法解析
微调框 微调框提供一种方法,让用户可以从值集中快速选择一个值.默认状态下,微调框显示其当前所选的值. 触摸微调框可显示下拉菜单,其中列有所有其他可用值,用户可从中选择一个新值. 您可以使用 Spinn ...
- 微信小程序基础之试图控件View、ScrollView、Swiper
今天写一篇关于微信小程序视图控件的文章,主要是介绍界面的搭建和部分操作js交互功能的介绍,转载请注明出处,谢谢~ 首先显示首页结构.创建三个navigator,用来跳转页面: <!--index ...
- activiti 多实例任务
1.1.1. 前言 个人,那么当5个人都投票的时候大概分为如下几种: 1.部门所有人都去投票,当所有人都投票完成的时候,这个节点结束,流程运转到下一个节点.(所有的人都需要投票) 2.部门所有人都去投 ...