安卓入门之ListView控件实现

版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/83013911

ListView介绍

安卓中ListView是一种自定义清单表,我们经常在淘宝上搜索宝贝后所出现的上下可滑动的商品列表、QQ/微信消息列表等都是ListView控件来做的,下面红框框中就是ListView。

有没有一种豁然开朗的感觉(疯狂暗示)。。。所以掌握ListView这种控件的使用方法对Android开发是非常有用的。从QQ消息清单中,每一个QQ好友列表就是ListView中的一个元素,每一行中我们发现有图像、Id、消息、时间,这些就是ListView的每一个元素的组成部分,所以ListView还是比较强大的 ,它可以自定义各种风格,只有你想不到,没有它做不到。


ListView使用原理

1.  建立自定义ListView显示样式layout_xml

2.  在Activity对应的XML中,拖入ListView,并设置ID

3.  在Activity中利用Java代码操作实现,适配器原理

An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a View for each item in the data set.(摘自Android官网)

                   什么是数据适配器?

下图展示了数据源、适配器、ListView等数据展示控件之间的关系。我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的。数据适配器正是建立了数据源与ListView之间的适配关系,将数据源转换为ListView能够显示的数据格式,从而将数据的来源与数据的显示进行解耦,降低程序的耦合性。这也体现了Android的适配器模式的使用。对于ListView、GridView等数据展示控件有多种数据适配器,本文讲解最通用的数据适配器——BaseAdapter。

.                 ListView的显示与缓存机制

我们知道,ListView、GridView等控件可以展示大量的数据信息。假如下图中的ListView可以展示100条信息,但是屏幕的尺寸是有限的,一屏幕只能显示下图中的7条。当向上滑动ListView的时候,item1被滑出了屏幕区域,那么系统就会将item1回收到Recycler中,即View缓冲池中,而将要显示的item8则会从缓存池中取出布局文件,并重新设置好item8需要显示的数据,并放入需要显示的位置。这就是ListView的缓冲机制,总结起来就是一句话:需要时才显示,显示完就被会收到缓存。ListView,GridView等数据显示控件通过这种缓存机制可以极大的节省系统资源。

.BaseAdapter

使用BaseAdapter比较简单,主要是通过继承此类来实现BaseAdapter的四个方法:

public int getCount(): 适配器中数据集的数据个数;

public Object getItem(int position): 获取数据集中与索引对应的数据项;

public long getItemId(int position): 获取指定行对应的ID;

public View getView(int position,View convertView,ViewGroup parent): 获取没一行Item的显示内容。


实战操作ListView

实战说明:创建一个简易学生信息(包含性别、姓名、序号信息)

实战方法如下:

   1.创建一个layout xml 并布局完善id

   2.在主XML中添加一个ListView控件和部分按钮,布局完善id

  3.代码部分解读:

创建Student信息类

//自定义Student类
private class Student
{
    String name;
    boolean sex;
    int id;
    public Student(String name,boolean sex,int id)
    {
        this.name=name;
        this.sex=sex;
        this.id=id;
    }

}

定义适配器

//定义adapter
private class MyListAdapter extends BaseAdapter
{
    // 男女图标
    Drawable[] icons = new Drawable[2];

    public MyListAdapter()
    {
        icons[0] = MainActivity.this.getDrawable(R.drawable.ic_female);
        icons[1] = getDrawable(R.drawable.ic_male);
    }

    @Override
    public int getCount()
    {
        // 一共多少项
        return listData.size();
    }

    @Override
    public Object getItem(int position)
    {
        // 获取每一项的数据
        return listData.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        // 获取某项对应的内部ID, 如果不需要,则直接把position作为ID
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        // 创建控件
        if (convertView == null)
        {
            //将自定义layout xml(list_item_student)添加给convertView
            convertView = getLayoutInflater()
                    .inflate(R.layout.list_item_student, parent, false);
        }
        // 获取数据
        Student data = (Student) getItem(position);
        // 显示数据
        TextView textView = (TextView) convertView.findViewById(R.id.id_textview);
        textView.setText(data.name+"("+data.id+")");

        ImageView imageView = (ImageView)convertView.findViewById(R.id.id_imageview);
        if (data.sex)
            imageView.setImageDrawable(icons[1]);
        else
            imageView.setImageDrawable(icons[0]);

        return convertView;
    }
}

使用adapter

//Activity主页中
@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
         // 准备数据
        listData.add(new Student("小张", true));
        listData.add(new Student("小王", false));
        listData.add(new Student("小李", true));

        //准备适配器
        MyListAdapter adapter=new MyListAdapter();

        //添加adapter
        ListView listview=(ListView)findViewById(R.id.id_listView);
        listview.setAdapter(adapter);

    }

效果图显示

展示的效果图另外还添加了一些功能,但是基本的框架跟以上介绍的是一样的。想要这个原码的可以私聊我哟(免费滴嘛)

谢谢观看,欢迎评论(如有不对,及时指教)

猜你喜欢

转载自blog.csdn.net/biggerchong/article/details/83013911