ListView案例集锦

ListView案例集锦

1.ArrayAdapter的创建方式

1.构造函数简介

public ArrayAdapter (Context context, int resource, T[] objects)

  • 上下文,就是当前的Java文件
  • 资源文件,就是每一个子项(每一行)的布局,比如当个的textView,带多选框的,带复选框的等等
  • 数据源,数组或者是集合

常见的小布局:

  • 前面统一写:android.R.layout.
simplelistitem1:每个列表项都是一个普通的textView
simplelistitem2:每个列表项都是一个普通的textView(字体略大)
simplelistitemchecked:每个列表项都是一个已勾选的列表项
simplelistitemmultiplechoice:每个列表项都是带多选框的文本
simplelistitemsingle_choice:每个列表项都是带单选框的文本

1.1数组当数据源

第一步:编写布局文件

<!--    数组当数据源-->
    <ListView
        android:id="@+id/mybooks"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:divider="@mipmap/blue"
        android:dividerHeight="10dp"
        />

第二步:创建数组数据,编写Java中的适配器

注意子项的布局文件开始要从android包开始导入。

第三步:绑定适配器

public class Listviewdemoactivity2Activity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listviewdemoactivity2);
//        第一步:获取布局文件中的ListView
        ListView listView=findViewById(R.id.mybooks);
//        第二步:创建数据源
        String[] books={"Java" ,"数据结构","大学计算机","专业英语","Vue速成"};
//        第三步:创建ArrayAdapter,传入数据
//        注意一个小小的问题,从系统中导入子项的布局文件的样式要从安卓的包开始写
        ArrayAdapter<String> adapter=new ArrayAdapter(this, android.R.layout.simple_list_item_1,books);
//      第四步:绑定适配器
        listView.setAdapter(adapter);
    }
}

效果图:

1.2集合当数据源

创建方式只需要把1.1的数组变成集合的形式就可以了。


public class Listviewdemoactivity2Activity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listviewdemoactivity2);
//      第二种:采用集合中的数据
//        第一步:获取布局文件中的ListView
        ListView listView=findViewById(R.id.mybooks);
//        第二步:创建数据源
        List<String> colthes=new ArrayList<String>();
        colthes.add("褂子");
        colthes.add("裤子");
        colthes.add("鞋子");
        colthes.add("袜子");
//        第三步:创建ArrayAdapter,传入数据
//        注意一个小小的问题,从系统中导入子项的布局文件的样式要从安卓的包开始写
        ArrayAdapter<String> adapter=new ArrayAdapter(this, android.R.layout.simple_list_item_1,colthes);
//      第四步:绑定适配器
        listView.setAdapter(adapter);
    }
}

效果图:

2.entries引入资源文件的方式

1.这种方式的好处是不用写Java文件。直接写布局文件就可以了。布局文件如下。

第一步:先去values中的string文件中建立一个phone的数组。

  • name指定的名字就是要引入的数组。
<resources>
    <string name="app_name">shiyan1</string>
<!--设置一个手机数组-->
    <string-array name="phone">
        <item>苹果</item>
        <item>华为</item>
        <item>小米</item>
    </string-array>

</resources>

第二步:mipmap中导入我们需要的分割线的图片。

  • 导入了一个blue.png

第三步:编写布局文件。

  • 设置分割线
  • 设置分割线的高度
  • entries引入我们第一步创建的数组

注意:此时数组中@array/数组名称,而不是我们的string。

<?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"
    android:orientation="vertical"
    tools:context=".Listviewdemoactivity2Activity">
<!--采用布局的方式进行创建-->
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/phone"
        android:divider="@mipmap/blue"
        android:dividerHeight="10dp"
        ></ListView>
</LinearLayout>

第四步:设置成主启动类。

<activity
    android:name=".Listviewdemoactivity2Activity"
    android:exported="true" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

效果图:

3.采用SimpleAdapter的创建方式

为什么需要引入SimpleAdapter,原先的ArrayAdapter一行中只允许创建一个简单的子项,原先的子项的布局方式都是系统指定的。而现在的子项的布局方式并不是引入系统的而是我们自己去指定的,所以可以实现非常强大的布局。

1.构造函数

public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, 
                                         int resource, String[] from, int[] to) 
  • 上下文
  • List代表的是整个ListView要显示的数据,Map代表的是每个子项需要显示的内容
  • Map中键的集合
  • 子项布局文件中的id,需要和参数进行一一的对应的

2.创建一个如下图所示的案例:

效果图:

第一步:创建一个父布局文件,写入一个Listview

<!--设置父布局-->
    <ListView
        android:id="@+id/mypeople"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
    ></ListView>
<!--    设置要显示的内容-->
    <TextView
        android:id="@+id/result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="当前选中的是:"
        android:textSize="30dp"
        />

第二步:创建一个子布局文件。命名为mylistpeople

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

    <ImageView
        android:maxHeight="20dp"
        android:maxWidth="20dp"
        android:adjustViewBounds="true"
        android:id="@+id/header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
       <TextView
           android:id="@+id/username"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"/>
       <TextView
           android:id="@+id/desc"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content" />
   </LinearLayout>
</LinearLayout>

第三步:去第一步创建的布局文件对应的activity进行编写SimpleAdapter的代码

  • 先往maimap中导入四张头像的图片im3.png,im4.png,im2.png,im1.png
public class SimpleadapterdemoActivity extends AppCompatActivity {
//创建数据
    private int header[]={R.mipmap.im1,R.mipmap.im2,R.mipmap.im3,R.mipmap.im4};
    private String username[]={"张三","李四","王五","赵六"};
    private String[] desc={"帅气","聪明","灵力","优秀"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simpleadapterdemo);
//       第一步:获取ListView对象
        ListView listView=findViewById(R.id.mypeople);
//        第二步:创建数据
        List<Map<String,Object>> mapList=new ArrayList<Map<String,Object>>();
//      第三步:初始化List集合
        for (int i = 0; i < 4; i++) {
            Map<String,Object> map=new HashMap<String,Object>();
            map.put("header",header[i]);
            map.put("username",username[i]);
            map.put("desc",desc[i]);
            mapList.add(map);
        }
//        第四步:创建一个SimpleAdapter
        SimpleAdapter simpleAdapter=new SimpleAdapter(this,mapList,R.layout.mylistpeople,new String[]{"header","username","desc"},new int[]{R.id.header,R.id.username,R.id.desc});
//      第五步:绑定适配器
        listView.setAdapter(simpleAdapter);
    }
}

此时创建的是没有设置监听器的,但是效果是有的:

第四步:设置监听器,将选中的信息动态的显示在下面

public class SimpleadapterdemoActivity extends AppCompatActivity {
//创建数据
    private int header[]={R.mipmap.im1,R.mipmap.im2,R.mipmap.im3,R.mipmap.im4};
    private String username[]={"张三","李四","王五","赵六"};
    private String[] desc={"帅气","聪明","灵力","优秀"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simpleadapterdemo);
//       第一步:获取ListView对象
        ListView listView=findViewById(R.id.mypeople);
//        第二步:创建数据
        List<Map<String,Object>> mapList=new ArrayList<Map<String,Object>>();
//      第三步:初始化List集合
        for (int i = 0; i < 4; i++) {
            Map<String,Object> map=new HashMap<String,Object>();
            map.put("header",header[i]);
            map.put("username",username[i]);
            map.put("desc",desc[i]);
            mapList.add(map);
        }
//        第四步:创建一个SimpleAdapter
        SimpleAdapter simpleAdapter=new SimpleAdapter(this,mapList,R.layout.mylistpeople,new String[]{"header","username","desc"},new int[]{R.id.header,R.id.username,R.id.desc});
//          补充:设置监听器
//        ListView中要显示的结果:
        TextView textView=this.findViewById(R.id.result);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                TextView name=(TextView) view.findViewById(R.id.username);
                TextView desc=(TextView) view.findViewById(R.id.desc);
//          设置textView区域显示的内容
//                一定要getText才能获取当前的文本,需要toString才能转换成文本
                String result="当前选中的是:"+name.getText().toString()+"个人简介是:"+desc.getText().toString();
                textView.setText(result);
//                弹出提示的内容
                Toast toast=Toast.makeText(SimpleadapterdemoActivity.this, result, Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER,0,0);
                toast.show();
            }
        });

        //      第五步:绑定适配器
        listView.setAdapter(simpleAdapter);

    }
}

完整的效果图:

3.1监听器

1.监听的方法。OnItemClickListener。

设置监听器的方法目的是为了做SimpleAdapter的案例的。

该监听器只有在点击子项目的时候才会进行触发的。

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {}

  • parent获取的是整个ListView要显示的东西。parent就是一个ListView对象(强制转换)。
  • view,可以通过getText获取当前控件中的文字
  • position,当前的子项目所在的位置
  • id,和position相同

可以通过parent进行数据的获取的。先强制转换成我们的ListView对象,再去获取adapter对象。获取ListAdapter对象后再去获取Model对象。

ListView listView = (ListView) parent;

ListAdapter listAdapter = listView.getAdapter();

SelfModel selfModel = (SelfModel) listAdapter.getItem(position);

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简单点了

谢谢大佬

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值