安卓基础学习——ListView与Adapter的使用

一、ListView的理解

  ListView是用来显示可滑动列表的ViewGroup,其使用与其他的布局步骤不同,需要动态地添加显示的内容。使用ListView显示列表的步骤如下:

  1. 指出ListView的显示位置,可以放在一个线性布局中;
  2. 给出每一个item的布局文件,用来设置item的显示结构(也就是ListView中每一项的具体形式);
  3. 准备数据;
  4. 准备数据适配器
  5. 设置数据适配器

  其中准备数据和数据适配器是学习ListView的重点。由于ListView中的每一个item是依次展示的,因此,数据的存放可以使用List集合或者数组。有了数据之后,需要将每一组数据添加到对应的item中,实现这一功能就需要数据适配器Adapter,ListView对象有一个方法可以用来设置Adapter:ListView.setAdapter(Adapter),下图展示了Adapter的作用:
安卓基础学习——ListView与Adapter的使用_第1张图片
二、Adapter

  在学习ListView中,最难理解的是Adapter,Adapter是一个接口,其中最常用的实现类有三个:

  • BaseAdapter:是一个抽象类,是我们最常用的
  • ArrayAdapter:是BaseAdapter的一个子类,可以直接使用
  • SimpleAdapter:是BaseAdapter的一个子类,可以直接使用

安卓基础学习——ListView与Adapter的使用_第2张图片
三、实现ListView

  通过Adapter实现ListView数据展示的步骤有三个:

  1. 准备数据
  2. 准备数据适配器
  3. 给ListView设置适配器

  下面分别介绍一下三种适配器的使用:

(1)ArrayAdapter

  我们已知ArrayAdapter是抽象类BaseAdapter的一个子类,因此可以直接进行创建对象使用。通过源码发现,ArrayAdapter含有两种构造方法:

//构造方法1:使用T类型的数组数据
public ArrayAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull T[] objects) {
        this(context, resource, 0, Arrays.asList(objects));
    }
//构造方法2:使用T类型的集合数据
public ArrayAdapter(@NonNull Context context, @LayoutRes int resource,
            @NonNull List<T> objects) {
        this(context, resource, 0, objects);
    }

  通过源码可以发现,构造方法中有三个参数需要给出:

  • Context context:上下文参数,一般使用this;
  • int resource: 给出item布局文件,一般是R.layout.item;
  • T[] objects、List objects:需要适配的数据。
public class MainActivity extends AppCompatActivity {

    private ListView lv1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv1 = (ListView) findViewById(R.id.lv1);
        //准备数据
        String[] data = {"a","b","c","d","e","f","g","h","i","g","k","l"};
        //准备数据适配器
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item_text,data);
        //设置适配器显示列表
        lv1.setAdapter(adapter);
    }
}

(2)SimpleAdapter

  同样的SimpleAdapter也是抽象类BaseAdapter的一个子类,也可以直接进行创建对象使用。通过源码发现,SimpleAdapter含有一种构造方法:

public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
            @LayoutRes int resource, String[] from, @IdRes int[] to) {
        mData = data;
        mResource = mDropDownResource = resource;
        mFrom = from;
        mTo = to;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

(3)BaseAdapter

  与上述两种Adapter不同,BaseAdapter是一个抽象类,在使用时需要自己写出一个子类并实现其中的抽象方法。并且,BaseAdapter需要的数据类型是List < T >,需要自定义一个类对数据进行包装。使用步骤如下:

  1. 给出数据:需要先自定义一数据包装类,再创建一个集合,添加自定义的类对象(Fruit类对象);
  2. 自定义MyAdapter,并实现抽象方法;
  3. 创建MyAdapter对象;
  4. 设置适配器
public class MainActivity_BaseAdapter extends AppCompatActivity {

    private ListView lv_baseAdapter;
    private List<Fruit> data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main__base_adapter);
        lv_baseAdapter = (ListView) findViewById(R.id.lv_baseAdapter);
        //給出数据
        data = new ArrayList<Fruit>();
        data.add(new Fruit("苹果",R.drawable.apple_pic));
        data.add(new Fruit("香蕉",R.drawable.banana_pic));
        data.add(new Fruit("樱桃",R.drawable.cherry_pic));
        data.add(new Fruit("葡萄",R.drawable.grape_pic));
        data.add(new Fruit("芒果",R.drawable.mango_pic));
        data.add(new Fruit("梨",R.drawable.pear_pic));
        data.add(new Fruit("菠萝",R.drawable.pineapple_pic));
        data.add(new Fruit("草莓",R.drawable.strawberry_pic));
        data.add(new Fruit("西瓜",R.drawable.watermelon_pic));
        data.add(new Fruit("苹果",R.drawable.apple_pic));
        data.add(new Fruit("香蕉",R.drawable.banana_pic));
        data.add(new Fruit("樱桃",R.drawable.cherry_pic));
        data.add(new Fruit("葡萄",R.drawable.grape_pic));
        data.add(new Fruit("芒果",R.drawable.mango_pic));
        data.add(new Fruit("梨",R.drawable.pear_pic));
        data.add(new Fruit("菠萝",R.drawable.pineapple_pic));
        data.add(new Fruit("草莓",R.drawable.strawberry_pic));
        data.add(new Fruit("西瓜",R.drawable.watermelon_pic));
        //给出适配器
        MyAdapter myAdapter = new MyAdapter();

        //设置适配器
        lv_baseAdapter.setAdapter(myAdapter);
    }
    private class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return data.size();
        }

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

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Log.d("wang", "getView: "+convertView);
            Fruit fruit = data.get(position);
            //加载布局(通过xml文件加载View要使用inflate方法)
            if (convertView==null) convertView=View.inflate(MainActivity_BaseAdapter.this,R.layout.item_baseadapter,null);
            //加载item中的组件,需要使用convertView.findViewById
            ImageView iv_item = (ImageView) convertView.findViewById(R.id.iv_item);
            TextView tv_item = (TextView) convertView.findViewById(R.id.tv_item);
            iv_item.setImageResource(fruit.getImageID());
            tv_item.setText(fruit.getName());
            return convertView;
        }
    }
}

你可能感兴趣的:(安卓,android,java)