1.什么是数据适配器—BaseAdapter?
数据的来源是各种各样的,ListView所展示的数据格式却是有一定要求的,数据适配器建立了数据源与ListView之间的适配关系,将数据源的数据转换为ListView能展示的数据格式。
2.BaseAdapter基本结构
//返回适配器中数据集中数据的个数
public int getCount() {
return0;
}
//获取数据集中与指定索引对应的数据项
public Object getItem(intposition) {
return null;
}
//获取指定行对应的ID
public long getItemId(intposition) {
return 0;
}
//获取每一个Item的显示内容
public View getView(intposition, View convertView, ViewGroup parent) {
return null;
}
3.使用ViewHolder优化BaseAdapter思路
1.创建Bean对象 用于封装数据
2.在构造方法中初始化用于映射的数据List
3.创建ViewHolder类,创建布局映射关系
4.判断convertView,为空则创建,并设置tag,否则通过tag来取出ViewHolder
5.给ViewHolder中的控件设置数据
IteamBean类:
package com.example.lenovo.baseadapter;
/**
* Created by lenovo on 2018/1/19.
*/
/*,每一个Beand对象对应ListView中的一条数据*/
public class ItemBean {
public int ItemImageResid;
public String ItemTitle;
public String ItemContent;
public ItemBean(int itemImageResid,String itemTitle,String itemContent ){
ItemImageResid=itemImageResid;
ItemTitle=itemTitle;
ItemContent=itemContent;
}
}
MyAdapter类;
package com.example.lenovo.baseadapter;
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;
/**
* Created by lenovo on 2018/1/22.
*/
public class MyAdapter extends BaseAdapter {
private List<ItemBean> mList;
//使用LayoutInflater方法将一个xml文件转化成一个view布局
private LayoutInflater mInflater;
//通过构造方法将数据源与数据适配器相关联
public MyAdapter(Context context, List<ItemBean> list){
mList=list;
mInflater=LayoutInflater.from(context);
}
@Override
public int getCount() {
return mList.size();
}
@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) {
ViewHolder viewHolder;
//充分利用ListView缓存机制,避免重复创建convertView
if(convertView==null){//为空:View未被实例化,缓存池中无缓存
viewHolder=new ViewHolder();
convertView=mInflater.inflate(R.layout.item,null);
viewHolder.imageView=convertView.findViewById(R.id.image);
viewHolder.title=convertView.findViewById(R.id.title);
viewHolder.content=convertView.findViewById(R.id.content);
//通过setTag将ViewHolder与convertView绑定
convertView.setTag(viewHolder);
}else {
viewHolder= (ViewHolder) convertView.getTag();//取出关联的ViewHolder
}
//对控件赋值
ItemBean bean=mList.get(position);
viewHolder.imageView.setImageResource(bean.ItemImageResid);
viewHolder.title.setText(bean.ItemTitle);
viewHolder.content.setText(bean.ItemContent);
return convertView;
}
//创建内部类ViewHolder,目的:避免重复的findViewbyId
class ViewHolder{
public ImageView imageView;
public TextView title;
public TextView content;
}
}
MainActivity类:
package com.example.lenovo.baseadapter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
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.ic_launcher_background,"我是标题"+i,"我是内容"+i));
}
//建立ListView与Adapter之间的联系
ListView listView=findViewById(R.id.main);
listView.setAdapter(new MyAdapter(this,itemBeanList));
}
}
xml文件:
activity_main:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.lenovo.baseadapter.MainActivity">
<ListView
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</RelativeLayout>
item:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/ic_launcher_background"/>
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_toEndOf="@+id/image"
android:layout_toRightOf="@+id/image"
android:text="Title"
android:gravity="center"
android:textSize="25sp"
/>
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_toEndOf="@+id/image"
android:layout_toRightOf="@+id/image"
android:layout_below="@+id/title"
android:text="Content"
android:gravity="center_vertical"
android:textSize="20sp"
/>
</RelativeLayout>
效果图: