您的位置:首页 > 其它

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));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BaseAdapte