Android 之 ListView的使用(一)

概述

在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。抽空把对ListView的使用做了整理,并写了个小例子。

一个ListView通常有两个职责。
(1)将数据填充到布局。
(2)处理用户的选择点击等操作。
第一点很好理解,ListView就是实现这个功能的。第二点也不难做到,在后面的学习中读者会发现,这非常简单。
一个ListView的创建需要3个元素。
(1)ListView中的每一列的View。
(2)填入View的数据或者图片等。
(3)连接数据与ListView的适配器。
也就是说,要使用ListView,首先要了解什么是适配器。适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便

 

主界面的布局

布局包含一个listview,宽高都是match_parent,撑满整个屏幕

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.coderstory.listview.MainActivity">

    <android.support.v7.widget.ListViewCompat
        android:layout_width="match_parent"
        android:id="@+id/myListView"
        android:layout_height="match_parent">
    </android.support.v7.widget.ListViewCompat>

</android.support.constraint.ConstraintLayout>

 

?List中item的布局

一个简单的布局:左边一个图片 ,右边一个文本.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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/myimage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/mytext"
        android:layout_width="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_gravity="center"
        android:layout_height="wrap_content" />

</LinearLayout>

 

item数据的实体类

用于保存每个item所需的数据

package com.coderstory.listview;

/**
 * 实体类 用于保存每个item的使用的数据
 * Created by cc on 2016/7/7.
 */

public class Entity {
    private String Name; //文本名称
    private int imageID; //图片资源的ID
    Entity(String Name,int imageID){
        this.Name=Name;
        this.imageID=imageID;
    }
    public String getName() {
        return Name;
    }
    public int getImageID() {
        return imageID;
    }


}

 

自定义适配器

在这里接受构建listview的item所需的数据(通过构造函数),然后构造每一个item(getview方法)

package com.coderstory.listview;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/**
 * Created by cc on 2016/7/7.
 */

public class myAdapter extends ArrayAdapter<Entity> {
    private  int resourceID;
    public myAdapter(Context context, int resource, List<Entity> objects) {
        super(context, resource, objects);
        resourceID=resource; //保存xml的id
    }
//解析每一条数据 实例化xml并初始化返回
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Entity entity=getItem(position);
        View view;
        ViewHolder vh;
        if(convertView!=null){ //查询布局是否已经缓存
            view=convertView;
            vh=(ViewHolder)view.getTag();//重新获取ViewHolder
        }else{
             view= LayoutInflater.from(getContext()).inflate(resourceID,null); //读取items.xml文件并实例化
              vh=new ViewHolder();
             vh.myimage= (ImageView) view.findViewById(R.id.myimage);//查找items实例中的myimage
              vh.mytext= (TextView) view.findViewById(R.id.mytext);//查找items实例中的mytext
             view.setTag(vh); //保存到view中
        }

        vh.myimage.setImageResource(entity.getImageID());//设置view中的图片
        vh.mytext.setText(entity.getName());//设置view中的文字
        return view;//返回这个自定义的view
    }

    //用于缓存控件的实例
    class ViewHolder{
        ImageView myimage;
        TextView mytext;
    }
}

 

主界面初始化listview

在这里创建显示listview的数据集合,创建和设置适配器。

package com.coderstory.listview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

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

public class MainActivity extends AppCompatActivity {

   // private String[] data={"A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D","A","B","C","D"};
    private List<Entity> list=new ArrayList<>();
    myAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       // ArrayAdapter<String> adapter=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,data);
       // ListView listview= (ListView) findViewById(R.id.myListView);
       // listview.setAdapter(adapter);

        initEntity();
        adapter=new myAdapter(MainActivity.this,R.layout.items,list); //创建适配器
        ListView listview= (ListView) findViewById(R.id.myListView);//找到这个listview
        listview.setAdapter(adapter);//设置适配器
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Entity entity=list.get(position);
                Toast.makeText(MainActivity.this,entity.getName(),Toast.LENGTH_SHORT).show();//显示当前点击的item
                list.remove(entity);//从数据源删除这个item的数据
                adapter.notifyDataSetChanged();//刷新listview
            }
        });
    }

    //创建数据
    private void initEntity() {
        Entity enity=new Entity("Name",R.mipmap.ic_launcher);
        list.add(enity);
        list.add(enity);
        list.add(enity);
        list.add(enity);
        list.add(enity);
    }
}

预览

Android 之 ListView的使用(一)-我的技术分享