一个基于BaseAdapter适配ListView的完整示例

  上一篇博客总结了一下适配ListView的几种Adapter,于是参考郭霖老师的《第一行代码》里面介绍ListView的章节,有一个FruitTest有点意思,书上采用的是ArrayAdapter来实现一个ImageView和一个TextView,本人也照着撸了一遍代码,发现运行时crash,通过Log发现指向TextView。

  后来网上去搜,看到网友的观点:ArrayAdapter一般用来处理TextView,而像要处理ImageView控件的Adapter,推荐使用SimpleAdapter或者BaseAdapter。捣鼓了两天ListView,参考了一些网友的代码,决定将郭霖老师中的FruitTest改为自定义一个Adapter去BaseAdapter来实现,并且做了基本的ListView优化:增加ViewHolder对item的view以及控件对象进行缓存。另外,还在子布局文件中添加一个Button,绑定监听器,实现了类似于网上水果订购的ListView UI,只是最基本的UI。趁记忆还在笔记和代码记录下来,作为自己的学习总结。


1.本文实现一个BaseAdapter的主要思路以及文件如下:

1)activity_main.xml: 布局一个ListView控件;

2)item_listview.xml:ListView的子布局文件,布局一个TextView, ImageView以及Button,分别用来显示水果的名字,图片和订购信息;

3)Fruit.java:定义一个Fruit类;
4)FruitAdapter.java:自定义一个adapter,然后去继承BaseAdapter,并且实现其中的抽象方法;
5)MainActivity.java:初始化数据源,给ListView设置adapter。



2.具体参考代码如下:

1)activity_main.xml




    

    





2)item_listview.xml:这里给Button设置了一个属性:android:focusable="false",用来取消Button控件在ListView item上的焦点,这样Button的点击响应不会覆盖item自身的点击响应




    

    

    
        


3)Fruit.java: 定义Fruit类,主要包含name和imageId两个成员变量,以及获取它们值的成员函数

package com.steven.fruitbaseadaptertest;

/**
 * Created by Steven on 2016/9/7.
 */
public class Fruit {

    private String name;
    private int imageId;

    public Fruit(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }


    public int getImageId() {
        return imageId;
    }
}


4) FruitAdapter:自定义的adapter,继承自BaseAdapter,并且实现四个抽象方法,主要的是getView方法。定义ViewHolder内部类,对滑出ListView的item view以及控件对象进行缓存,避免下次重新滑入ListView的item重新绘制view和重新获取控件对象,做了基本的ListView优化,同时给Button绑定Listener。


package com.steven.fruitbaseadaptertest;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

/**
 * Created by Steven on 2016/9/7.
 */
public class FruitAdapter extends BaseAdapter
{
    private ArrayList fruitList;
    Context context;

    //从构造函数中获取fruitList和Context对象.
    public FruitAdapter(ArrayList fruitList, Context context)
    {
        this.fruitList = fruitList;
        this.context = context;

    }

    public int getCount()
    {
        return fruitList.size();
    }

    public Object getItem(int position)
    {
        return null;
    }

    public long getItemId(int position)
    {
        return 0;
    }

    public View getView(int position, View convertView, ViewGroup parent)
    {
        final Fruit fruit = fruitList.get(position); 		//获取当前item的水果实例

        View v;
        ViewHolder holder;

        //滑入ListView中的item view没有缓存
        if(convertView == null)
        {
            v = LayoutInflater.from(context).inflate(R.layout.fruit_item, null);//动态加载滑入ListView的item的子布局文件,并绘制item view

	    /*  缓存子布局文件中的控件对象*/
            holder = new ViewHolder();
            holder.fruitName = (TextView)v.findViewById(R.id.fruit_name);
            holder.fruitImage = (ImageView)v.findViewById(R.id.fruit_image);
            holder.fruitSubmit = (Button)v.findViewById(R.id.btn_submit);
            v.setTag(holder);
        }
        //滑入ListView中的item view有缓存
        else
        {
            v = convertView;					        //取出缓存的item View对象
            holder = (ViewHolder)v.getTag();	                        //重新获取ViewHolder对象
        }

        holder.fruitName.setText(fruit.getName());			//设置fruitName
        holder.fruitImage.setImageResource(fruit.getImageId());		//设置fruitImage

        //为Button对象添加监听器
        holder.fruitSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(context,"你已经订购" + fruit.getName(), Toast.LENGTH_SHORT).show();
            }
        });

        return v;
    }


    /*  定义ViewHolder用来缓存item view控件  */
    class ViewHolder
    {
        ImageView fruitImage;
        TextView fruitName;
        Button fruitSubmit;
    }

}





5)MainActivity.java: 初始化数据源fruitList,给ListView设置adapter,并添加item点击响应事件

package com.steven.fruitbaseadaptertest;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

 public class MainActivity extends Activity
 {
     private ArrayList fruitList;

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

         fruitList = new ArrayList<>();		                                //创建一个存放水果信息的ArrayList对象
         initFruit();							        //初始化水果数据

         ListView listView = (ListView)findViewById(R.id.list_view);	        //获取布局文件中的ListView控件对象
         listView.setAdapter(new FruitAdapter(fruitList, MainActivity.this));	//为listView设定adapter


         //为listView绑定事件监听
         listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
             @Override
             public void onItemClick(
                     AdapterView parent,
                     View view,
                     int position,
                     long id) {

                 //获得用户点击到的item上的水果实例
                 Fruit fruit = fruitList.get(position);

                 //Toast显示点击该水果的信息
                 Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();
             }
         });
     }

     public void initFruit()
     {
         //创建水果对象
         Fruit fruit1 = new Fruit("苹果", R.drawable.apple_pic);
         Fruit fruit2 = new Fruit("香蕉", R.drawable.banana_pic);
         Fruit fruit3 = new Fruit("樱桃", R.drawable.cherry_pic);
         Fruit fruit4 = new Fruit("葡萄", R.drawable.grape_pic);
         Fruit fruit5 = new Fruit("芒果", R.drawable.mango_pic);
         Fruit fruit6 = new Fruit("桔子", R.drawable.orange_pic);
         Fruit fruit7 = new Fruit("梨", R.drawable.pear_pic);
         Fruit fruit8 = new Fruit("菠萝", R.drawable.pineapple_pic);
         Fruit fruit9 = new Fruit("草莓", R.drawable.strawberry_pic);
         Fruit fruit10 = new Fruit("西瓜", R.drawable.watermelon_pic);

         //将水果对象添加到集合中
         fruitList.add(fruit1);
         fruitList.add(fruit2);
         fruitList.add(fruit3);
         fruitList.add(fruit4);
         fruitList.add(fruit5);
         fruitList.add(fruit6);
         fruitList.add(fruit7);
         fruitList.add(fruit8);
         fruitList.add(fruit9);
         fruitList.add(fruit10);
     }
 }


Demo演示效果:

1.程序静态下:
一个基于BaseAdapter适配ListView的完整示例_第1张图片



2.点击“苹果”的item:
一个基于BaseAdapter适配ListView的完整示例_第2张图片


3.点击“苹果”后面的“订购”:
一个基于BaseAdapter适配ListView的完整示例_第3张图片


以上代码,还有很多改进的地方,但对于刚接触ListView的同学们可以作为参考,我自己本身也是新手,坚持把每次学到的东西及时作总结。再接再厉!


你可能感兴趣的:(Android初步)