Android之BaseAdapter的优雅实现
2015-10-22 18:38
537 查看
在android的开发过程中,我们不可避免的要使用ListView来展示我们的Activity上面的内容。你可以使用很多种方式来实现这一功能,但是如何优雅快速的来实现呢?这就是我要写的了,既为了大家共同进步,也为了以后自己复习方便。话不多说,上代码吧。
首先要在main_activity.xml 文件中写好我们的布局文件其实也就是一个ListView,然后是对于其内每一个Item,我们要展示的布局样式,如item.xml:
然后对应此xml文件,我们需要声明一个bean的方式的java文件,用来封装对应的资源:
下面就是BaseAdapter的实现类了,为了代码的复用,我把BaseAdapter封装了起来,方便维护和修改,内部包含三个方式,我最推崇的是没有被注释的那个,代码如下:
最后就是在MainActivity中添加实现了。代码如下:
好了,代码就是这样了,然后看一下程序的效果图吧(界面没有修改,比较难看,望见谅)
。
首先要在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:Android Fragment嵌套使用存在的一些BUG以及解决方法
- Android中实现蓝牙录放音
- android RecyclerView的基本介绍及用法(一)
- 【Android效果集】弹幕效果
- Android: Launching activities
- android 5.0的input init过程
- android原生(Google)下拉刷新SwipeRefreshLayout
- 001.android初级篇之ToolBar
- Android学习笔记-ExpandableListView的使用
- Android 打造风格统一的导航之v7 ToolBar
- Android四大组件之BroadCastReceiver
- Android 如何加载巨图?
- Android APK优化工具Zipalign详解
- 【笔记】Android中Toast的使用技巧
- android:强大的图片下载和缓存库Picasso
- Android SDK在线更新镜像服务器大全
- android百度地图(一)
- Ubuntu 下将VP9移植到Android
- android数据库更新
- Andorid 布局layout_margin和padding分析