Android最常用的控件ListView(详解)

这篇具有很好参考价值的文章主要介绍了Android最常用的控件ListView(详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.ListView简介

       在Android开发中,ListView是一个比较常用的控件。它以列表的形式 展示具体数据内容,并且能够根据数据的长度自适应屏幕显示。

二.ListView简单用法

 代码部分

    1.布局界面 activity_main.xml 代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">
   <ListView
     android:id="@+id/list_view"
     android:layout_width="match_parent"
     android:layout_height="match_parent"/>
</LinearLayout>

   2.类文件 MainActivity.java 代码:

package com.example.listview1;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//1、定义对象
     ListView listView;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         //2、绑定控件
         listView=(ListView) findViewById(R.id.list_view);
         //3、准备数据
         String[] data={"菠萝","芒果","石榴","葡萄", "苹果", "橙子", "西瓜","菠萝","芒果","石榴","葡萄", "苹果", "橙子", "西瓜","菠萝","芒果","石榴","葡萄", "苹果", "橙子", "西瓜"};
         //4、创建适配器 连接数据源和控件的桥梁
         //参数 1:当前的上下文环境
         //参数 2:当前列表项所加载的布局文件
         //(android.R.layout.simple_list_item_1)这里的布局文件是Android内置的,里面只有一个textview控件用来显示简单的文本内容
         //参数 3:数据源
         ArrayAdapter<String> adapter=new ArrayAdapter<>(MainActivity.this,android.R.layout.simple_list_item_1,data);
         //5、将适配器加载到控件中
         listView.setAdapter(adapter);
         //6、为列表中选中的项添加单击响应事件
         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
{
         @Override
         public void onItemClick(AdapterView<?> parent, View view, int i, long l) {
         String result=((TextView)view).getText().toString();
         Toast.makeText(MainActivity.this,"您选择的水果是:"+result,Toast.LENGTH_LONG).show();
         }
     });
   }
 }

代码解析

   1.ArrayAdapter适配器

1、ArrayAdapter适用亍数组或数据ArrayList(动态数组)。

2、ArrayAdapter可以通过泛型来指定要适配的数据类型,然后在构造凼数中把要适配的数据传入。

3、ArrayAdapter有多个构造函数的重载,可以根据实际情况选择最合适的一种。

 2.点击事件响应

Android最常用的控件ListView(详解)

Parent: 指定哪个AdapterView(可能会有多个ListView,区分多个ListView)

View: 为你点击的Listview的某一项的内容,来源于adapter。如用((TextView)view).getText().toString(),可以取出点击的这一项的内容,转为string 类型。

Position: 指的是adapter的某一项的位置,如点击了listview第2项,而第2项对应 的是adapter的第2个数值,那此时position的值就为1了。注:这些数值都是从0开 始的。

Id:id的值为点击了Listview的哪一项对应的数值,点击了listview第2项,那id就等于1。一般和position相同。

 Android最常用的控件ListView(详解)

三.定制 ListView 界面

只能显示一段文本的listview太单调了,我们现在就来对listview的界面进行定制,让其丰富内容。

Android最常用的控件ListView(详解)

  代码部分

    1.布局界面 activity_main.xml 代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".MainActivity">
     <ListView
         android:id="@+id/list_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
</LinearLayout>

  2.类文件 MainActivity.java 代码:

package com.example.listview2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
     //第一步:定义对象
     ListView listView;
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         //第二步:绑定控件
         listView = (ListView) findViewById(R.id.list_view);
         //第三步:准备数据
         List<Fruit> fruitlist = new ArrayList<>();
         for (int i = 0; i <2 ; i++) {
             Fruit pineapple=new Fruit(R.drawable.pineapple,"菠萝","¥16.9 元/KG");
             fruitlist.add(pineapple);
             Fruit mango = new Fruit(R.drawable.mango, "芒果","¥29.9 元/kg");
             fruitlist.add(mango);
             Fruit pomegranate = new Fruit(R.drawable.pomegranate, "石榴","¥15元/kg");
             fruitlist.add(pomegranate);
             Fruit grape = new Fruit(R.drawable.grape, "葡萄","¥19.9 元/kg");
             fruitlist.add(grape);
             Fruit apple = new Fruit(R.drawable.apple, "苹果","¥20 元/kg");
             fruitlist.add(apple);
             Fruit orange = new Fruit(R.drawable.orange, "橙子","¥18.8 元/kg");
             fruitlist.add(orange);
             Fruit watermelon = new Fruit(R.drawable.watermelon, "西瓜","¥28.8元/kg");
             fruitlist.add(watermelon);
         }
         //第四步:设计每一个列表项的子布局
         //第五步:定义适配器 控件 -桥梁-数据
         FruitAdapter adapter=new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitlist);
         listView.setAdapter(adapter);
   }
}

  3.类文件 Fruit.java 代码:

package com.example.listview2;
public class Fruit {
private int imageID;
private String name;
private String price;
     public int getImageID() {
         return imageID;
     }
     public String getName() {
         return name;
     }
     public String getPrice() {
         return price;
     }
     public Fruit(int imageID, String name, String price) {
         this.imageID = imageID;
         this.name = name;
         this.price = price;
     }
}

  4.类文件 FruitAdapter.java 代码:

package com.example.listview2;
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;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
//用于将上下文、listview 子项布局的 id 和数据都传递过来
public class FruitAdapter extends ArrayAdapter<Fruit> {
 public FruitAdapter(@NonNull Context context, int resource, @NonNull List<Fruit> objects) {
     super(context, resource, objects);
 }
//每个子项被滚动到屏幕内的时候会被调用
     @NonNull
     @Override
     public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
     Fruit fruit=getItem(position);//得到当前项的 Fruit 实例
     //为每一个子项加载设定的布局
     View view=LayoutInflater.from(getContext()).inflate(R.layout.fruit_item,parent,false);
     //分别获取 image view 和 textview 的实例
     ImageView fruitimage =view.findViewById(R.id.fruit_image);
     TextView fruitname =view.findViewById(R.id.fruit_name);
     TextView fruitprice=view.findViewById(R.id.fruit_price);
     // 设置要显示的图片和文字
     fruitimage.setImageResource(fruit.getImageID());
     fruitname.setText(fruit.getName());
     fruitprice.setText(fruit.getPrice());
     return view;
     }
}

  5.布局界面 fruit_item.xml 代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:orientation="horizontal"
     android:layout_height="wrap_content">
     <ImageView
         android:id="@+id/fruit_image"
         android:src="@drawable/apple"
         android:layout_width="100dp"
         android:layout_height="80dp"/>
     <TextView
         android:id="@+id/fruit_name"
         android:layout_gravity="center_vertical"
         android:textSize="30sp"
         android:textColor="#000000"
         android:text="name"
         android:layout_marginLeft="10dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
     <TextView
         android:id="@+id/fruit_price"
         android:layout_gravity="center_vertical"
         android:textColor="#ff0000"
         android:text="price"
         android:textSize="30sp"
         android:layout_marginLeft="10dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
</LinearLayout>

  代码解析

   1.引入动态数组ArrayList

数组的缺点

(1)数组长度固定

(2)定义数组只能指定一种数据类型

 ArrayList:可以动态增加和缩减的索引序列,它是基于数组实现的list类

List<Fruit> fruitlist = new ArrayList<>();

List泛型里面既包括图片又包含文本,因此我们要定义一个Fruit类

2.Fruit类

public class Fruit {
private int imageID;
private String name;
private String price;
}

 在里面添加图片的id,名称和价格

 然后按下Alt+Insert键添加构造方法(Constructor)Get方法(Getter)

3.自定义适配器 控件 -桥梁-数据

为什么要自定义适配器?

    原因在于,当我们想用一些其他的展现方式,或者是本案例我们需要的图文混排的呈现方式,这就需要DIY了。

1.我们定义一个自定义适配器 FruitAdapter继承ArrayAdapter。

2.自定义适配器中常用的方法:getCount、getView、getItem、getItemId。

(1)创建好后需要添加泛型(也就是我们创建的Fruit类)

(2)按下键盘上的Alt+Enter键创建构造方法(倒数第二个list<T>)

(3)重写getView方法

4.inflate()方法

  inflate()方法的三个参数

inflate(R.layout.fruit_item,parent,false)

1、第一个参数是布局;(自己写的)

2、第二个参数是父容器控件;

3、第三个布尔值参数表明是否连接该布局和其父容器控件,在这里的情况设置 为false,因为系统已经插入了这个布局到父控件,设置为true将会产生多余的一 个View Group。

四.提升ListView的运行效率

      目前我们ListView的运行效率是很低的,因为在FruitAdapter的 getView()方法中,每次都将布局重 新加载了一遍,将快速滚动的时候, 这将会成为性能的瓶颈。

Android最常用的控件ListView(详解)

 getView()方法中的convertView参数,用于将之前加载好的布局进行缓存,以便之 后可以进行重用。

优化方法一:

Android最常用的控件ListView(详解)

优化方法二:

Android最常用的控件ListView(详解)

 代码:

package com.example.listview3;
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;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
//用于将上下文、listview 子项布局的 id 和数据都传递过来
public class FruitAdapter extends ArrayAdapter<Fruit> {
     public FruitAdapter(@NonNull Context context, int resource, @NonNull List<Fruit> objects) {
         super(context, resource, objects);
     }
     @NonNull
     @Override
     public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
         Fruit fruit=getItem(position);//获取当前项的 Fruit 实例
         View view;
         //新增一个内部类 ViewHolder,用于对控件的实例进行缓存
         ViewHolder viewHolder;
         if (convertView==null){
             //为每一个子项加载设定的布局
             view= LayoutInflater.from(getContext()).inflate(R.layout.fruit_item,parent,false);                     
             viewHolder=new ViewHolder();
             //分别获取 imageview 和 textview 的实例
             viewHolder.fruitimage =view.findViewById(R.id.fruit_image);
             viewHolder.fruitname =view.findViewById(R.id.fruit_name);
             viewHolder.fruitprice=view.findViewById(R.id.fruit_price);
             view.setTag(viewHolder);//将 viewHolder 存储在 view 中
         }else {
             view=convertView;
             viewHolder= (ViewHolder) view.getTag();//重新获取 viewHolder
     }
         // 设置要显示的图片和文字
         viewHolder.fruitimage.setImageResource(fruit.getImageID());
         viewHolder.fruitname.setText(fruit.getName());
         viewHolder.fruitprice.setText(fruit.getPrice());
         return view;
     }
     private class ViewHolder {
         ImageView fruitimage;
         TextView fruitname;
         TextView fruitprice;
     }
}

五.ListView的点击事件

ListView的滚动毕竟只是满足 了我们视觉上的效果,下面我们来学习ListView如何才能响 应用户的点击事件。

代码:

//第六步:listview 的点击事件
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
         @Override
         public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
             Fruit fruit= fruitlist.get(position) ;
             Toast.makeText(MainActivity.this,"您选择的水果是:"+fruit.getName(),Toast.LENGTH_LONG).show();
         }
     });

六.总结

Android最常用的控件ListView(详解)

七.参考资料

      点击免费下载文章来源地址https://www.toymoban.com/news/detail-407802.html

到了这里,关于Android最常用的控件ListView(详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android开发——控件EditText, 2.获取EditText输入的数据,通过按钮点击实现,ImageView控件,缩放类型,控件ProgressBar,常用属性详解,进度条设置

    1. android : hint 输入提示 2. android : textColorHint  输入提示文字的颜色 3. android : inputType  输入类型 4. android : drawableXxxx 在输入框的指定方位添加图片 5. android : drawablePadding  设置图片与输入内容的间距 6. android : paddingxxxx  设置内容与边框的间距 7. android : backgrou

    2024年02月07日
    浏览(35)
  • ListView控件的使用

    ListView是由ListView控件、Adapter适配器、ListView子布局、传入的数据格式、指定Adapter适配器  共5个部分组成 首先,在想要使用ListView控件的地方写上ListView控件  编写ListView的每条的布局,也就是ListView的子布局 这里我写了两个并列的textview,效果如下:  编写传入数据的数据格

    2023年04月18日
    浏览(54)
  • Android常用控件

    View类 View 类是所有 Android 控件和容器的父类,常见属性如图所示。  (1)TextView控件 TextView 控件继承自 View 类,用于在界面上显示一段文本信息。除了拥有View类的属性,还发展了些自己的属性,常用的如下图所示。   (2)EditText控件 EditText 控件允许用户在控件里输入和编

    2024年02月11日
    浏览(38)
  • Android学习(五):常用控件

    TextView EditText Button RadioButton ImageView 1、TextView控件 1.1、简介 TextView是用于显示文字(字符串)的控件,可在代码中通过设置属性改变文字的大小、颜色、样式等功能。 1.2、示例 2、EditText控件 2.1、简介 EditText继承自TextView,可以进行编辑操作,将用户信息传递给Android程序。还可

    2024年01月21日
    浏览(30)
  • C#中listView控件详细使用方法

    当使用C#中的 ListView 控件时,你可以通过以下详细方法使用它: 在窗体上放置 ListView 控件: 在 Visual Studio 的窗体设计器中,从工具箱中拖动并放置一个 ListView 控件到你的窗体上。 设置 ListView 的属性: View :设置 ListView 的显示模式。常见的显示模式包括 Details (详细信息)

    2024年02月16日
    浏览(27)
  • WPF真入门教程12--ListView控件

           ListView 控件在Windows应用程序中常用,用于表示数据列表。如果您以前使用过 WinForms,那么您对ListView的实用性有一个很好的了解,但您应该意识到 WPF中的ListView 不像WinForms版本那样使用。再一次的主要区别在于,虽然WinForms ListView只是调用Windows API 函数来呈现常见的

    2024年02月04日
    浏览(37)
  • Android Studio(控件常用属性)

    通用属性 属性 描述 android:id 用于为视图指定唯一的标识符。 android:layout_width 用于指定视图的宽度。 android:layout_height 用于指定视图的高度。 android:layout_margin 用于指定视图周围的空白区域。 android:layout_padding 用于指定视图内部的填充区域。 android:background 用于设置视图的背景

    2024年02月05日
    浏览(32)
  • c# 从零到精通 form界面之listView控件

    c# c# 从零到精通 form界面之listView控件 using System; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Test04 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text == “”) { MessageBox.Show(“项目

    2024年02月08日
    浏览(34)
  • MySQL最常问的10道面试题(2023详解版)

            简单来说,聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,称为非聚集索引,也叫做二级索引。 由于在InnoDB引擎里面,一张表的数据对应的物理文件本身就是按照B+树来组织的一种索引结构,而聚集索引就是按照每张表的主键来构建一颗B+树,

    2024年02月13日
    浏览(51)
  • Android studio 之 ListView

    ListView 绑定的适配器是 BaseAdapter。 在MyAdapter类中的getView方法中,我们注意到,上面的写法在每个视图出现时都会执行,有多少个item就会调用多少次 getView() 如果item太多就会很浪费资源!! 在 getView 方法中,首先检查 convertView 是否为空。 如果为空,表示当前屏幕上没有可复

    2024年01月23日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包