前言:在Android开发中,ListView是比较常用的组件,可以用来用列表的形式显示图片文字等多文本类型的内容
本文目的:通过简单的例子来展示ListView的常规使用,本文中实现的效果与上一篇文章《Android列表布局专题(一)RecyclerView》中实现的完全相同,以对比ListView与RecyclerView在实际场景中的不同。
本文Demo下载地址:https://github.com/ShaoWangYun/SlideViewDemo
最终效果图:
一、布局文件:
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的简单用法。
最后,欢迎大家在评论区留言。