ListView的简单使用

来源:互联网 发布:淘宝上的台式机 编辑:程序博客网 时间:2024/06/07 05:48

ListView控件在Android开发中使用非常广泛,在许多的应用的场景上都能看到它的身影,下面用一个小例子来简单的使用一下ListView控件。

1.创建项目,在MainActivity对应的布局中声明出ListView控件

 <ListView        android:id="@+id/lv"        android:layout_width="match_parent"        android:layout_height="match_parent">
</ListView>
2.在MainActivity的onCreate方法中找到该控件,并封装假数据,设置适配器,设置监听事件

    private ListView lv;    private List<Contacts> list;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //找到控件        lv = (ListView) findViewById(R.id.lv);        //初始化数据        initData();        //为ListView设置适配器        lv.setAdapter(new MyAdapter(list));        //为ListView的条目设置监听器        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            //处理店家事件,弹出提示            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {                Toast.makeText(MainActivity.this, "您点击了:" + list.get(i).getContactName() +                        ",电话号码为:" + list.get(i).getContactNumber(), Toast.LENGTH_SHORT).show();            }        });    }    /**     * 初始化数据     *     * @author Summer     * create at 2017/8/19 16:06     */    private void initData() {        list = new ArrayList<Contacts>();        for (int i = 0; i < 15; i++) {            list.add(new Contacts("张三", "13012345678"));            list.add(new Contacts("李四", "13012344564"));            list.add(new Contacts("王五", "13012355486"));            list.add(new Contacts("那个谁", "13012354656"));        }    }
监听器中的逻辑是在点击某一项条目时,弹出具体详情。

其中List的泛型Contacts是自定义的一个Javabean

/** * 封装联系人的Javabean * Created by Summer on 2017/8/19. */public class Contacts {    private String contactName;    private String contactNumber;    public Contacts(String contactName, String contactNumber) {        this.contactName = contactName;        this.contactNumber = contactNumber;    }    public String getContactName() {        return contactName;    }    public String getContactNumber() {        return contactNumber;    }}
此时适配器MyAdapter还没有创建,所以程序会报错

3.创建MyAdapter适配器,MyAdapter继承了BaseAdapter,并实现了其中四个抽象方法,增加了一个带一个参数的构造方法,用来接收传递进来的数据。

import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import java.util.List;/** * 自定义的Adapter继承了BaseAdapter * Created by Summer on 2017/8/19. */public class MyAdapter extends BaseAdapter {    private List<Contacts> list;    //构造方法,用于接收传递进来的参数    public MyAdapter(List<Contacts> list) {        this.list = list;    }    //以下四个方法是BaseAdapter中的抽象方法    //返回数据源数量    @Override    public int getCount() {        return list.size();    }    //返回滚动进来的数据源对象    @Override    public Object getItem(int i) {        return list.get(i);    }    //返回ID    @Override    public long getItemId(int i) {        return i;    }    //用于加载布局,并给布局中组件赋值,传递到ListView中    @Override    public View getView(int i, View view, ViewGroup viewGroup) {        //声明自定义View对象,用于存放条目布局        View listView = null;        //自定义内部类。用于优化ListView        ViewHolder holder = null;        //优化ListView的代码,复用view        if (view == null) {            //加载条目布局            listView = View.inflate(viewGroup.getContext(), R.layout.item_listview, null);            holder = new ViewHolder();            //将控件放置到内部类中,可以复用已经存在的控件对象,节省内存            holder.contactName = listView.findViewById(R.id.listview_name);            holder.contactNumber = listView.findViewById(R.id.listview_number);            //将holder存储到自定义的view中            listView.setTag(holder);        } else {            //复用已存在的view            listView = view;            holder = (ViewHolder) listView.getTag();        }        //为空间赋值        holder.contactName.setText(list.get(i).getContactName());        holder.contactNumber.setText(list.get(i).getContactNumber());        return listView;    }    /**     * 自定义内部类,为优化ListView     *     * @author Summer     *         create at 2017/8/19 17:04     */    class ViewHolder {        private TextView contactName;        private TextView contactNumber;    }}

getView中两次优化了ListView,提高了ListView的效率。

第一次优化是复用的getView方法中的view参数,view中缓存了上次加载好的布局,这样就防止多次加载布局,提升运行效率

第二次优化是使用了自定义的ViewHolder内部类,该类中存在两个成员变量,分别对应着item_listview中的两个TextView,在使用findViewById的时候,直接将找到的对象赋值给ViewHolder中的两个成员变量,这样就可以复用上次已经找到了的控件实例,不需要每次都要去findViewById,节省了时间与空间,进一步的提升了ListView的运行效率。

在getView中加载了一个名为item_listview的布局,此为ListView的条目布局,具体代码如下:

<?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"    android:orientation="horizontal"    >    <TextView        android:id="@+id/listview_name"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:gravity="center"        android:text="test"        android:padding="15dp"        android:textColor="#000"        android:textSize="16sp" />    <TextView        android:id="@+id/listview_number"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:gravity="center"        android:padding="15dp"        android:text="test"        android:textColor="#000"        android:textSize="16sp" /></LinearLayout>
使用了两个TextView,分别代表联系人的名字和电话号码
5.运行效果截图


6.到此就大功告成啦~,本人学生一枚,如果您发现有什么不足的地方,还请留言指点,谢谢您。



原创粉丝点击