BaseAdapter数据适配器
2016-06-05 16:48
316 查看
ListView的显示和缓存机制
需要才显示,显示完就回收到缓存
基本结构
public int getCount() 适配器中数据集中数据的个数public Object getItem(int position) 获取数据集中与指定索引对应的数据项
public long getItemId(int positon) 获取指定行对应的ID
public View getView(int position, View convertView, ViewGroup parent) 获取每一个Item的内容
ViewHolder优化BaseAdapter的思路
创建Bean对象,用于封装数据在构造方法中初始化用于映射的数据List
创建ViewHolder类,创建布局映射关系
判断convertView,为空则创建,并设置tag,否则通过tag来取出ViewHolder
给ViewHolder中的控件设置数据
代码示例:
主界面新建ListView<ListView android:id="@+id/lv_main" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView>
新建item.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/iv_image" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/banshee"/> <TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="30dp" android:layout_toRightOf="@+id/iv_image" android:text="Title" android:gravity="center" android:textSize="16sp"/> <TextView android:id="@+id/tv_text" android:layout_width="match_parent" android:layout_height="30dp" android:layout_toRightOf="@+id/iv_image" android:layout_below="@+id/tv_title" android:text="Hello World" android:gravity="center" android:textSize="12sp"/> </RelativeLayout>
新建ItemBean.java
package com.bcp.galleryandimageswitcher; import android.widget.ImageView; import android.widget.TextView; public class ItemBean { public int ItemImageResid; public String ItemTitle, ItemContent; public ItemBean(int itemImageResid,String itemTitle,String itemContent){ ItemImageResid=itemImageResid; ItemTitle=itemTitle; ItemContent=itemContent; } }
新建Myadapter.java
package com.bcp.galleryandimageswitcher; 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; import java.util.List; 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);//context:要使用当前adapter的界面对象 //mInflater 布局装载器对象 } @Override public int getCount() { return mList.size();//返回ListView需要显示的数据量 } @Override public Object getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; } //返回每一项的显示内容 @Override public View getView(int position, View convertView, ViewGroup parent) { //效率低下的方式,每次都创建新的view,设置控件,效率很低 // View view=mInflater.inflate(R.layout.item,null); // ImageView imageView= (ImageView) view.findViewById(R.id.iv_image); // TextView title= (TextView) view.findViewById(R.id.tv_title); // TextView content= (TextView) view.findViewById(R.id.tv_text); // ItemBean bean=mList.get(position); // imageView.setImageResource(bean.ItemImageResid); // title.setText(bean.ItemTitle); // content.setText(bean.ItemContent); // return view; //普通式 利用了ListView的缓存特性,如果没有缓存才创建新的View //但findViewById还是会很费时 // if (convertView==null){//view未被实例化,缓存池中无缓存 // convertView=mInflater.inflate(R.layout.item,null); // } // ImageView imageView= (ImageView) convertView.findViewById(R.id.iv_image); // TextView title= (TextView) convertView.findViewById(R.id.tv_title); // TextView content= (TextView) convertView.findViewById(R.id.tv_text); // ItemBean bean=mList.get(position); // imageView.setImageResource(bean.ItemImageResid); // title.setText(bean.ItemTitle); // content.setText(bean.ItemContent); // return convertView; //最终方式 //利用了ListView的缓存,并且通过ViewHolder类实现显示数据的视图缓存,避免多次findViewById ViewHolder viewHolder;//声明一个对象,包含所需的三个控件,避免重复findViewById操作 if (convertView==null){ viewHolder=new ViewHolder(); convertView=mInflater.inflate(R.layout.item,null); viewHolder.imageView=(ImageView) convertView.findViewById(R.id.iv_image); viewHolder.title=(TextView) convertView.findViewById(R.id.tv_title); viewHolder.content=(TextView) convertView.findViewById(R.id.tv_text); convertView.setTag(viewHolder); }else{ viewHolder= (ViewHolder) convertView.getTag(); } ItemBean bean=mList.get(position); viewHolder.imageView.setImageResource(bean.ItemImageResid); viewHolder.title.setText(bean.ItemTitle); viewHolder.content.setText(bean.ItemContent); return convertView; } //最终方式使用的内部类 class ViewHolder{ public ImageView imageView; public TextView title,content; } }
修改MainActivity.java
package com.bcp.galleryandimageswitcher; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Gallery; import android.widget.ListView; import android.widget.SeekBar; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); List<ItemBean> itemBeanList=new ArrayList<>(); for (int i=0;i<20;i++){ itemBeanList.add(new ItemBean( R.drawable.banshee,"我是标题i","我是内容i" )); } ListView listView= (ListView) findViewById(R.id.lv_main); listView.setAdapter(new MyAdapter(this,itemBeanList)); } }
相关文章推荐
- BaseAdapter的使用
- SuperBaseAdapter以及BaseHolder的抽取封装
- Android万能适配器Adapter
- 列表视图(ListView)——BaseAdapter
- 用BaseAdapter解决Listview列表项中的子控件无法获得焦点
- ListView的使用(二)
- ListView之BaseAdapter和AsyncTask异步任务
- BaseAdapter与ListView解析
- ListView、GridView的通用型adapter
- Android BaseAdapter的极简封装
- BaseAdapter 三重境界
- 【Android 基础】 BaseAdapter
- Adapter类型控件之构建一个可复用的自定义BaseAdapter
- ListView、GrideView通用适配器
- 优化使用的BaseAdapter
- RecyclerView之BaseRecyclerViewAdapterHelper(一)
- 仿RecycleView.Adapter封装BaseAdapter
- BaseAdapter的封装来实现模块化开发
- ListView和Adapter使用详解
- ListView最基本的使用方法BaseAdapter(三)