Android控件listview ListView的用法

在Android开发中,ListView是一个比较常用的控件,它以列表的形式展示数据内容,并且能够根据列表的高度自适应屏幕显示。ListView的样式是由属性决定的,它的常用属性如下所示

  1. android:listSelector

点击后改变背景颜色

  1. android:divider

设置分割线的颜色(配合android:dividerHeight使用)

  1. android:dividerHeight

设置分割线的高度

我给弄宽点

  1. android:scrollbars

是否显示滚动条

  1. android:requiresFadingEdge

渐变阴影

使用listview需要数据适配器来传输数据

数据适配器是数据与视图之间的桥梁,它类似于一个转换器,将复杂的数据转换成用户可以接受的方式进行呈现。

常用的数据适配器:

BaseAdapter:基本的适配器

SimpleAdapter:继承自BaseAdapter

ArrayAdapter:也是BaseAdapter的子类

  1. BaseAdapter

BaseAdapter顾名思义是基本的适配器。它实际上是一个抽象类,通常在自定义适配器时会继承BaseAdapter,该类拥有四个抽象方法,根据这几个抽象方法对ListView控件进行数据适配。BaseAdapter中的4个抽象方法如下所示

public int getCount()

获取列表的条数

public Object getItem(int position)

获取该位置(position)的对象

public long getItemId(int position)

获取该位置(position)对象的id

public View getView(int position, View convertView, ViewGroup parent)

获取相应position对应的条目视图,position是当前条目的位置,convertView用于复用旧视图,parent用于加载XML布局。

接下来我们通过一个购物商城的案例来演示如何通过ListView控件与数据适配器显示一个商品信息的列表。本案例的界面效果如下图所示。

主界面的xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:gravity="center"
        android:text="购物商城"
        android:textSize="40sp"
        android:textColor="#FFF"
        android:background="#FF8F03"/>
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv"
        />
</LinearLayout>

每一个条目的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="15dp">

    <ImageView
        android:layout_width="180dp"
        android:layout_height="146dp"
        android:background="@drawable/apple"
        android:id="@+id/iv_1" />
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/iv_1"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="苹果"
            android:textSize="30sp"
            android:textColor="#FF8F03"
            android:id="@+id/tv_name"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="价格:"
            android:textSize="30sp"
            android:textColor="#FF8F03"
            android:id="@+id/tv_1"
            android:layout_below="@id/tv_name"
            android:layout_marginTop="30dp"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/tv_1"
            android:layout_alignTop="@id/tv_1"
            android:textSize="30sp"
            android:textColor="#FF8F03"
            android:id="@+id/tv_prise"
            android:text="66yuan"/>
    </RelativeLayout>

</RelativeLayout>

后端代码实现

package com.example.listview;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private String[]titles={"桌子","苹果","蛋糕","线衣","猕猴桃","围巾"};
    private String[]prices = {"1800元", "10元/kg", "300元", "350元", "10元/kg",
            "280元"};
    private int[]icons={R.drawable.table,R.drawable.apple,R.drawable.cake,R.drawable.wireclothes,
            R.drawable.kiwifruit,R.drawable.scarf};

    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView=findViewById(R.id.lv);
        myAdapter myAdapter=new myAdapter();
        listView.setAdapter(myAdapter);
    }

    class myAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            return titles.length;
        }

        @Override
        public Object getItem(int i) {
            return titles[i];
        }

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

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            ViewHolder viewHolder=new ViewHolder();
            if (view==null){
                view=View.inflate(MainActivity.this,R.layout.list_item,null);
                viewHolder.iv=view.findViewById(R.id.iv_1);
                viewHolder.title=view.findViewById(R.id.tv_name);
                viewHolder.price=view.findViewById(R.id.tv_prise);
                view.setTag(viewHolder);
            }
            else {
                viewHolder=(ViewHolder) view.getTag();
            }
            viewHolder.price.setText(prices[i]);
            viewHolder.title.setText(titles[i]);
            viewHolder.iv.setBackgroundResource(icons[i]);
            return view;
        }
        class ViewHolder{
            TextView title,price;
            ImageView iv;
        }
     }
}

效果图

这个是把要更改的一些东西搞成数组。

这是将条目那一堆东西合在一块变成一个view对象。

如果没有就新建一个view

利用viewholder里面的属性来对view里面的控件逐一监听

最后给这个view打个标签,方便下一次viewholder直接在标签里面取。

直接gettag直接获取上一个view,相当于复用view

重新设定具体值,ok。

猜你喜欢

转载自blog.csdn.net/qq_64628470/article/details/129486833