对控件ListView的理解与使用
来源:互联网 发布:成都知创科技有限公司 编辑:程序博客网 时间:2024/05/16 10:06
ListView这个控件,所有开发Android的人都会用过的吧,不过相对于RecyclerView而言,ListView我算是用的非常少的了。所以说到对ListView真正的多了解,自己却并不是那么熟悉,所以就重新去理解使用一番ListView,还可以配上Popupwindow + ListView + SearchView做一个组合类似的搜索。之后的组合搜索我之后会上传。
先还是按照最基本的放上一个ListView的xml,以及一个ListView子项Item的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="com.example.chenxuanhe.searchviewtest.MainActivity"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent"/></LinearLayout>
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:layout_height="wrap_content" > <ImageView android:id="@+id/list_img" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/list_txt" android:layout_marginStart="10dp" android:layout_gravity="center_vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="dadadadaadadd" /></LinearLayout>
这是一个Imageview 和一个TextView最基本的搭配。
首先,一个ListView需要三样东西:
1.数据工具类
2.适配器
3.ListView主代码
1.(数据工具类)先创建一个Bean文件
public class Bean { private String name; private int id; public Bean(String name ,int Id){ this.name =name; this.id=Id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; }}
这是一个工具类,其中的Int id就是图片的id,也就是R.drawable.xxx这种格式,这里需要说明一下,个人理解,有关于参数的int id部分,如果不是一个int 整形的传参,那么都可以理解为是传递一个R的id值,适配器的构造方法也会出现一个int id值,可以综合理解。
当然数据这里就自己给个数据数组
private String[] data = {"A", "B", "C", "D", "ad", "adaf", "E", "F", "Q", "BW", "CE", "DR", "ad", "adaf", "Ez", "FX", "A", "BZ", "CDD", "DFA", "ad", "adaf", "E", "F", "AZCZ", "BC", "CBB", "DV", "adS", "adaf", "E", "F"};
2.适配器Adapter
关于这里的适配器,我有一点模仿RecyclerView的适配写法,因为传统的ListView的适配器有三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,并且他们的使用方式类似listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
这种感觉,当然可能是个人理解问题,由于本人用多了RecyclerView所以喜欢再写一个适配器,这样搭配上Holder更加的方便。这里我们写一个MyAdapter类作为我们的适配器,让他去继承ArrayAdapter《Bean》于是代码如下:
class MyAdapter extends ArrayAdapter<Bean> { private int ResourceId; public MyAdapter(Context context, int txtId, List<Bean> obj) { // 该构造该函数的int id 就是需要R.layout.item这样的方式 super(context, txtId, obj); this.ResourceId = txtId; }//这是重写最重要的一个方法同时进行了优化//也用到了Holder的复用,对于ListView的性能大大优化 @Override public View getView(int position, View convertView, ViewGroup viewGroup) { Bean bean = getItem(position); MyHolder myHolder; View view; if (convertView == null) { //如果view是空,则创建新对象,一系列操作,不然就直接复用存在View中的holder对象,避免重复new对象 view = LayoutInflater.from(getContext()).inflate(ResourceId, viewGroup, false); myHolder = new MyHolder(); myHolder.txt = (TextView) view.findViewById(R.id.list_txt); myHolder.img = (ImageView) view.findViewById(R.id.list_img); view.setTag(myHolder);//将holder对象存进view //Tag可以理解为一个标志,可自行百度 } else { view = convertView; myHolder = (MyHolder) view.getTag();//取出holder对象 } //Holder对于view的复用,十分强大 myHolder.txt.setText(bean.getName()); myHolder.img.setImageResource(bean.getId()); return view; } } class MyHolder { ImageView img; TextView txt; }
3.ListView的主代码,则肯定就是在MainActivity里面啦。首先声明一个工具类的List,用来存放会用到的数据 private List<Bean> beanList = new ArrayList<>();
之后的代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data); MyAdapter adapter = new MyAdapter(this, R.layout.item_view, beanList);//这里就是开始讲到的int id的用法,将item的view作为id传给构造方法,这样new出一个适配器 ListView listView = (ListView) this.findViewById(R.id.list_view); listView.setAdapter(adapter); //这里是用于ListView的每个子Item被点击到之后的操作 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Bean bean = beanList.get(i); Toast.makeText(MainActivity.this, bean.getName(), Toast.LENGTH_SHORT).show(); } }); init(); }//这就是一个将开始的数据数组一次取出放入到之前声明的list中去//然后在new适配器的时候将声明了的List放入适配器中就OK了 private void init() { for (int i = 0; i < data.length; i++) { String one = data[i]; //注意看这里就用到了Bean.class的构造方法中的int id //这里的id传入的就是R.drawable.my这样的R值 Bean bean = new Bean(one, R.drawable.my); beanList.add(bean); } }}
到这里ListView的全部介绍完了,当然,就个人意见,能用到RecyclerView的就尽量用RecyclerView(RecyclerView+CardView的效果还是很好的呦~),因为觉得毕竟一个强大的控件就可以尽量多用,当然有些效果RecyclerView就没有ListView那样容易实现,所以也算是多少学习ListView的用法吧。
以下是效果图:
- 对控件ListView的理解与使用
- listView控件的理解
- 对listView的理解
- 对Android ListView的理解
- 对ListView新的理解
- ListView控件的使用
- ListView 控件的使用
- ListView控件的使用
- ListView控件的使用
- listview控件的使用。
- ListView控件的使用
- ListView控件的使用
- ListView控件的使用
- ListView控件的使用
- 对IO的初步理解与使用
- Android中对GridView, ListView等滚动控件的Touch事件onInterceptTouchEvent,onTouchEvent理解
- Android 基本控件的使用五(ListView 与 ArrayAdapter)
- Android基础控件ListView的使用与焦点冲突解决
- Linux下的文件编译与调试
- mysql 基本操作总结
- 获取 metadata 的完整例子
- Accurate Scale Estimation for Robust Visual Tracking代码解析
- 文件上传
- 对控件ListView的理解与使用
- WINCC读写SQL数据库的示例
- Nginx 内置全局变量
- 通过一个word模板来生成新的word并且填充内容
- C语言-尼科彻斯定理
- 高并发量网站解决方案
- MySQL索引原理及慢查询优化
- smartbi试用体验
- Androdi 帧动画