自定义适配器--ListView数据源的绑定

ListView 利用自定义的适配器,使用缓存机制优化

首先,ListView完整写法的三个步骤: 

1、初始化数据源

2、定义适配器

3、加载适配器


一、数据源

1、定义数组保存已经准备好的数据源

2、定义List之后装载数据源 其中,可通过自定义泛型来自定义数据源的类型 

private List<ItemBean>  dataList;     //装载数据源

//一个ListView item项所包含的东西--自定义的泛型类
public class ItemBean {

    public int itemImageId;        //一个Item项所包含的的数据
    public String itemName;         //可在其他类中引用

    public ItemBean(int itemImageId, String itemName) {
        this.itemImageId = itemImageId;
        this.itemName = itemName;
    }
}
 
//初始化数据源
private void initData() {
    dataList=new ArrayList<>();
    for(int i=0;i<iconImage_res.length;i++){
        dataList.add(new ItemBean(iconImage_res[i],iconName_res[i]));	//数据源的数组
                //将每一个Item添加进List
    }
}
二、自定义适配器
1、新建类,继承BaseAdapter ,实现方法
    构造方法:
public MyAdapter(List<ItemBean> dataList, Context context) {
    layoutInflater=LayoutInflater.from(context);
    this.dataList = dataList;
}
2、getView() 方法使用缓存机制--使用ViewHolder和 convertView
  新建内部类ViewHolder,将控件作为成员属性
 
private class ViewHolder {
    private ImageView itemImage;
    private TextView itemName;      //一个ListView项的名称
}
public View getView(int position, View convertView, ViewGroup viewGroup) {
    ViewHolder viewHolder=new ViewHolder(); //装载id的中介
    if(convertView==null){      //将二者绑定
        convertView=layoutInflater.inflate(R.layout.lv_item,null);
        viewHolder.itemImage= (ImageView) convertView.findViewById(R.id.iv_icon);
                    //用来装载控件,这样可以不用每次去findId
        viewHolder.itemName= (TextView) convertView.findViewById(R.id.tv_iconName);
        convertView.setTag(viewHolder);
    }else {
        viewHolder= (ViewHolder) convertView.getTag();
    }
    ItemBean bean=dataList.get(position);   //通过ViewHolder找到对应控件
    viewHolder.itemImage.setImageResource(bean.itemImageId);
    viewHolder.itemName.setText(bean.itemName);
    return convertView;
}
 

三、加载适配器,添加点击事件

 
实例化ListView和adapter ,实现监听接口 onItemClickListener
 
 
例子如下:
 
 
package codefirst.listview_test;

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 cheng on 2017/1/25.
 */
//自定义的适配器

public class MyAdapter extends BaseAdapter {

    private List
     
     
      
       dataList;      //装载数据源
    //private Context context;    //getView()方法的布局装载器需要用到
    private LayoutInflater layoutInflater;      //布局装载器

    public MyAdapter(List
      
      
       
        dataList, Context context) {
        this.layoutInflater=LayoutInflater.from(context);
        this.dataList = dataList;
    }

    @Override
    public int getCount() {
        return dataList.size();
    }
//对象
    @Override
    public Object getItem(int position) {
        return dataList.get(position);
    }

    @Override
    public long getItemId(int postion) {
        return postion;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder viewHolder=new ViewHolder(); //装载id的中介
        if(convertView==null){      //将二者绑定
            convertView=layoutInflater.inflate(R.layout.lv_item,null);
            viewHolder.itemImage= (ImageView) convertView.findViewById(R.id.iv_icon);
                        //用来装载控件,这样可以不用每次去findId
            viewHolder.itemName= (TextView) convertView.findViewById(R.id.tv_iconName);
            convertView.setTag(viewHolder);
        }else {
            viewHolder= (ViewHolder) convertView.getTag();
        }
        ItemBean bean=dataList.get(position);   //通过ViewHolder找到对应控件
        viewHolder.itemImage.setImageResource(bean.itemImageId);
        viewHolder.itemName.setText(bean.itemName);
        return convertView;
        //findID没有再用一个中介去保存
   /*     if(convertView==null){
            convertView=layoutInflater.inflate(R.layout.lv_item,null);
                //缓存机制
            ItemBean bean=dataList.get(position);       //一个项
            ImageView itemImage= (ImageView) convertView.findViewById(R.id.iv_icon);
            TextView itemName= (TextView) convertView.findViewById(R.id.tv_iconName);
            itemImage.setImageResource(bean.itemImageId);
            itemName.setText(bean.itemName);
        }*/
        //没有用到缓存
     /*   View view=layoutInflater.inflate(R.layout.lv_item,null);
     /*                       //将一个布局文件转化为一个view
        ItemBean bean=dataList.get(position);       //一个item项的内容
        ImageView imageView= (ImageView) view.findViewById(R.id.iv_icon);
        TextView textView= (TextView) view.findViewById(R.id.tv_iconName);
        imageView.setImageResource(bean.itemImageId);   //对象调用成员属性
        textView.setText(bean.itemName);

        return view;*/
        //return convertView;

    }
//自定义泛型----内部类
    private class ViewHolder {
        private ImageView itemImage;
        private TextView itemName;      //一个ListView项的名称
    }
}package codefirst.listview_test;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private String iconName_res[]={"通讯录","漂亮","日历","相机","闹钟","游戏",
            "短信","音乐","河流","设置","气球","天气","地图","视频"};   //名称数据源
    private int iconImage_res[]={R.mipmap.address_book,R.mipmap.beau,R.mipmap.calendar,
        R.mipmap.camera,R.mipmap.clock,R.mipmap.games_control,R.mipmap.messenger,
        R.mipmap.ringtone,R.mipmap.riven,R.mipmap.settings,R.mipmap.speech_balloon,
        R.mipmap.weather,R.mipmap.world,R.mipmap.youtube};

    private List
       
       
        
         dataList;     //装载数据源
    private MyAdapter adapter;
    private ListView listItem_lv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
        initAdapter();
        listItem_lv= (ListView) findViewById(R.id.lv_main);
        listItem_lv.setAdapter(adapter);

    }

    private void initAdapter() {
        adapter=new MyAdapter(dataList,this);

    }

    //初始化数据源
    private void initData() {
        dataList=new ArrayList<>();
        for(int i=0;i
        
        
       
       
      
      
     
     
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芒果-橙

谢谢啦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值