两种使用ListView的方法
来源:互联网 发布:2016电影 知乎 编辑:程序博客网 时间:2024/06/16 20:20
ListView可以说是我们在进行Android开发时候最常见的控件之一了,那么我们该如何使用呢?这里主要介绍两种方法。
1、使用Activity(继承自AppCompactActivity)+ListView控件
2、使用Activity(继承自ListActivity)
首先,让我们来看看第一种方法。用一个小例子来介绍一下。
Step1:新建一个工程,修改activity_main.xml的代码如下
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout 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.xkw.listviewtest.MainActivity"> <ListView android:id="@+id/listview_fruit" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /></android.support.constraint.ConstraintLayout>
在这里我们只添加了一个ListView的控件,并没有添加其它的东西。
Step2:如图,layout右键->new->Layout Source File,新建一个listitem.xml文件。这个listitem就是listview里面的每一个小单元要显示的东西,这里我们只显示一个字符串就只添加一个TextView控件就行。
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/fruit_name" android:layout_width="match_parent" android:layout_height="51dp" android:textSize="24sp" /></android.support.constraint.ConstraintLayout>
Step3:在MainActivity里面修改代码如下
package com.example.xkw.listviewtest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import java.util.ArrayList;public class MainActivity extends AppCompatActivity { //自己定义的一组用于显示的数据 private String[] fruit ={"苹果","香蕉","橙子","西瓜","梨","葡萄","菠萝","草莓","芒果","蔓越莓","榴莲","山竹","柚子","哈密瓜","水蜜桃","番石榴","黄桃","蛇果","蜜瓜","蓝莓","甘蔗"}; private FruitAdapter mfruitAdapter; private ListView mlistView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mlistView = (ListView)findViewById(R.id.listview_fruit); mfruitAdapter = new FruitAdapter(); initFruits(); mlistView.setAdapter(mfruitAdapter); mlistView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Toast.makeText(MainActivity.this,"您选择了:" + ((Fruit) mfruitAdapter.getItem(i)).getName(),Toast.LENGTH_SHORT).show(); } }); } private void initFruits(){ for (int i = 0;i < fruit.length;i ++){ Fruit newfruit = new Fruit(fruit[i]); mfruitAdapter.addFruit(newfruit); } } public class Fruit{ //定义了一个水果类 private String Name; //private int ImageId; //用于存放水果图片的Id,此处没有 public Fruit(String name){ this.Name = name; } public String getName(){ return Name; } } private class FruitAdapter extends BaseAdapter{ private ArrayList<Fruit> mFruit; private LayoutInflater mInflator; public FruitAdapter(){ super(); mFruit = new ArrayList<Fruit>(); mInflator = MainActivity.this.getLayoutInflater(); } public void addFruit(Fruit fruit){ mFruit.add(fruit); } @Override public int getCount() { return mFruit.size(); } @Override public Object getItem(int i) { return mFruit.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { ViewHolder viewHolder; //常规ListView优化代码 if (view == null){ //注意inflate()的第三个参数必须设置为false,不然会和onCreate函数里面的setContentView冲突 view = mInflator.inflate(R.layout.listitem,null,false); viewHolder = new ViewHolder(); viewHolder.fruitName = (TextView)view.findViewById(R.id.fruit_name); view.setTag(viewHolder);//将ViewHolder储存至view内 } else { viewHolder = (ViewHolder)view.getTag();//从view内读取ViewHolder } Fruit fruit = mFruit.get(i); viewHolder.fruitName.setText(fruit.getName()); return view; } class ViewHolder{ //定义了一个内部类ViewHolder用于对每一个水果的信息进行缓存 TextView fruitName; } }}
下面我们来详细分析一下这段代码。
首先先解释一下定义的几个类:
Fruit类是一个水果类,用于存放每一个水果的相关信息(名字,价钱,图片……这里为了简便只有一个名字);
FruitAdapter类继承于BaseAdapter,是一个自己定义的Adapter;
ViewHolder是一个内部类,用于缓存读取到的Fruit类实例的Name变量(这样就不用每一次都用findviewbyid()去找这个变量)。
首先,自己预先定义一些用于显示的数据。
private String[] fruit ={"苹果","香蕉","橙子","西瓜","梨","葡萄","菠萝","草莓","芒果","蔓越莓", "榴莲","山竹","柚子","哈密瓜","水蜜桃","番石榴","黄桃","蛇果","蜜瓜","蓝莓","甘蔗"};
然后,在onCreate()函数里面绑定ListView控件并设定相应的Adapter即可(Adapter是数据(Data)和界面(UI)之间的桥梁)。总的来说,只需要一下这么几步:绑定控件->添加数据->设定Adapter,就可以实现ListView的显示功能了。
setContentView(R.layout.activity_main);//加载布局文件mlistView = (ListView)findViewById(R.id.listview_fruit);//绑定控件mfruitAdapter = new FruitAdapter();//新建一个AdapterinitFruits();//添加数据mlistView.setAdapter(mfruitAdapter);//设定Adapter
这么几行代码就已经可以完成显示的功能了,话不多说,直接来看看实际效果图。
但是假如一个ListView只有显示的功能未免太过鸡肋,那么就让我们来添加一下点击处理函数。其实很简单,只需要直接调用listview的setOnItemClickListener()函数即可(参数i就是点击的单元的序号)。如下,我们在里面通过Toast显示用户点击了哪一个水果。
mlistView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Toast.makeText(MainActivity.this,"您选择了:" + ((Fruit) mfruitAdapter.getItem(i)).getName(),Toast.LENGTH_SHORT).show(); } });
至此为止,一个完整的ListView就已经实现了。以上就是介绍的第一种实现ListView的方法。
下面介绍第二种实现ListView的方法,就是让这个类继承自ListActivity。
public class MainActivity extends ListActivity {protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); }}
然后其他的就和第一种用法差不多了,同样的新建Fruit和FruitAdapter,ViewHolder三个类。需要注意的是,ListActivity是没有布局文件的!!!但是Android Studio默认生成的是继承自AppCompactActivity的活动,在onCreate()函数里面会加载布局文件,所以假如创建的时候没有注意勾选不要布局文件的话一定要注意把onCreate()函数里面的setContentView(R.layout.activity_main);这句话注释掉!!!不然运行会报错。
介绍一下使用ListActivity相较于第一种方法的几个细微之处。
1、ListActivity本身已经定义了点击函数,我们需要做的只是重载一下就好了。
protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Toast.makeText(MainActivity.this,"您选择了:" + ((Fruit) mfruitAdapter.getItem(position)).getName(),Toast.LENGTH_SHORT).show(); }
2、同样绑定Adapter的函数ListActivity也已经帮我们做好了,我们只需要直接调用就好了。
setListAdapter(mfruitAdapter);
程序运行之后,可以看到与第一种效果一模一样,具体图在这里就不贴了。
源码下载
ListView的两种实现方法就介绍到这里了。理论上来说用哪种方法都是可以的,看你喜欢用哪种而已。但是个人比较推荐第一种方法,使用listview控件,不要继承于ListActivity。因为继承自ListActivity的话是没有布局文件的,能修改的只有默认的ActionBar,但是Google现在已经推出了Material Design,而ActionBar也被更灵活的ToolBar所取代,越来越多的应用也开始采用ToolBar的设计方式,但是使用ToolBar需要自己定义布局文件,与ListActivity不能使用布局文件是矛盾的,所以更建议大家使用listview控件。以上纯属个人之愚见,欢迎有不同意见的评论交流。
- 两种使用ListView的方法
- LISTVIEW绑定数据的两种方法
- ListView绑定数据的两种方法
- ListView 数据绑定的两种方法
- ListView的两种实现方法
- 动态设置ListView的高度的两种方法
- 关于Listview显示不同条目的两种方法
- C# ListView 删除选定行的两种方法
- ScrollView包裹ListView的两种处理方法
- Android 数据库与listview绑定的两种方法
- ListView中实现部分刷新的两种方法
- 两种方法解决ScrollView嵌套ListView出现ListView显示不全的问题
- 【listview】pinned-section-listview应用 + 两种布局的listview
- Android使用Handler的两种方法
- 两种使用自定义UITableViewCell的方法
- 使用线程的两种方法
- android使用全局变量的两种方法
- Excel SQL使用的两种方法
- AS3.0输入法注释无文字选择界面
- 【angular】TypeScript 搭建
- zookeeper集群的搭建及介绍
- 使用dropwizard(3)-加入DI-dagger2
- 自顶向下,逐步求精
- 两种使用ListView的方法
- Liunx(八)
- 查找整数
- 函数模板
- Mac Vue.js 安装并初始化项目
- 在Django中自定义filter并在template中使用
- Aras innovator: TOC目录简单汉化方法
- 使用dropwizard(4)-加入测试-jacoco代码覆盖率
- 11.25作业(ZLY)