android alertdialog_Android列表布局专题(二)ListView

本文介绍如何使用Android中的ListView组件,并通过实例演示其基本用法。文章涵盖了布局文件配置、数据实体类创建、自定义适配器及事件监听等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

62f14a00fae7e5a913207807dbad1fe9.png

前言:在Android开发中,ListView是比较常用的组件,可以用来用列表的形式显示图片文字等多文本类型的内容

本文目的:通过简单的例子来展示ListView的常规使用,本文中实现的效果与上一篇文章《Android列表布局专题(一)RecyclerView》中实现的完全相同,以对比ListView与RecyclerView在实际场景中的不同。

本文Demo下载地址:https://github.com/ShaoWangYun/SlideViewDemo

最终效果图:

6321ff0d7a81aa71122b5b5baeb4e937.png

一、布局文件:

1.activity_list_view.xml

<?xml version="1.0" encoding="utf-8"?>    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:padding="15dp"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".listview.ListViewActivity">            android:id="@+id/list_view"        android:layout_width="match_parent"        android:layout_height="match_parent">    

2.list_item.xml

<?xml version="1.0" encoding="utf-8"?>    xmlns:android="http://schemas.android.com/apk/res/android"    android:padding="15dp"    android:layout_width="match_parent"    android:layout_height="wrap_content">            android:id="@+id/image"        android:src="@mipmap/ic_launcher_round"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />            android:id="@+id/text_list"        android:layout_centerVertical="true"        android:layout_toRightOf="@+id/image"        android:layout_marginLeft="20dp"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />

二、数据实体类

public class ListDataBean {    private String Index;    public String getIndex () {        return Index;    }    public void setIndex (String index) {        Index = index;    }    public ListDataBean (String index) {        Index = index;    }    public ListDataBean () {    }    @Override    public String toString () {        return "RecyclerDataBean{" +                "Index='" + Index + '\'' +                '}';    }}

三、适配器

public class ListAdapter extends BaseAdapter {    private Context context = null;    private List list = new ArrayList<>();    public ListAdapter(Context context,Listlist) {        this.context = context;        this.list = list;    }    @Override    public int getCount() {        return list.size();    }    @Override    public ListDataBean getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder mHolder;        if (convertView == null) {            mHolder = new ViewHolder();            LayoutInflater inflater = LayoutInflater.from(context);            convertView = inflater.inflate(R.layout.list_item, null, true);            mHolder.Index = (TextView) convertView.findViewById(R.id.text_list);            convertView.setTag(mHolder);        } else {            mHolder = (ViewHolder) convertView.getTag();        }        String index = list.get(position).getIndex();        mHolder.Index.setText(index);        return convertView;    }    //自定义的ViewHolder,持有每个Item的的所有界面元素    public class ViewHolder {        private TextView Index;    }}

四、主界面

public class ListViewActivity extends AppCompatActivity {    private ListView list_view;    private ListAdapter listAdapter;    private List listDataBeans = new ArrayList<>();    @Override    protected void onCreate (Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_list_view);        initView();    }    private void initView(){        list_view = findViewById(R.id.list_view);        makeData();        refreshListView();    }    //循环生成一组假数据,作为RecyclerView的子项数据源,后续将会对recyclerDataBeans中的这20条数据进行操作    private void makeData(){        for(int i=0; i<20; i++){            ListDataBean listDataBean = new ListDataBean();            listDataBean.setIndex(String.valueOf(i));            listDataBeans.add(listDataBean);        }        listAdapter = new ListAdapter(ListViewActivity.this,listDataBeans);        list_view.setAdapter(listAdapter);    }    private void refreshListView(){        listAdapter = new ListAdapter(ListViewActivity.this,listDataBeans);        list_view.setAdapter(listAdapter);        list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick (AdapterView> parent, View view, int position, long id) {                Utils.showLog("单击事件","click!!!");                Utils.showToast(ListViewActivity.this,"您点击了的子项的序号为:"+listAdapter.getItem(position).getIndex(),0);            }        });        list_view.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {            @Override            public boolean onItemLongClick (AdapterView> parent, View view, final int position, long id) {                Utils.showLog("长按事件","click!!!");                AlertDialog.Builder builder = new AlertDialog.Builder(ListViewActivity.this);                builder.setTitle("警告");                builder.setCancelable(false);                builder.setMessage("你想要删除序号为 " + listAdapter.getItem(position).getIndex() + " 的数据么?");                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        try {                            //获取position(便于局部刷新recyclerview)                            int deleteposition = getPositionFromList(listAdapter.getItem(position).getIndex());                            //刷新UI                            listDataBeans.remove(deleteposition);                            refreshListView();                            listAdapter.notifyDataSetChanged();                            //提示用户                            Utils.showToast(ListViewActivity.this, "删除成功", 1);                        } catch (Exception e) {                            e.printStackTrace();                            Utils.showToast(ListViewActivity.this, "删除失败", 1);                        }                        dialog.dismiss();                    }                });                builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        dialog.dismiss();                    }                });                builder.create().show();                return true;            }        });    }    //根据studentID获取该条数据在list中的下标,便于对recyclerview进行局部刷新    private int getPositionFromList(String index){        List list = listDataBeans;        for(int i=0;i            if(list.get(i).getIndex().equals(index)){                return i;            }        }        return -1;    }}

五、写在最后

本文通过最直接的方式,展示了ListView的简单用法,它不像RecyclerView一样必须自己手写点击事件还有长按事件等,使用起来比较便捷。但是也有明显的弊端,比如说,RecyclerView支持局部刷新的功能,而且可以灵活的设置间距、分割条、动画等等。这些都是原生的ListView不具备的优秀特性,但是之前查到过有人对ListView进行了优化,也能够实现部分的优秀特性,感兴趣的话,可以Github上搜索ListViewAnimations。下一期会讲解GridView的简单用法。

最后,欢迎大家在评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值