`
yhz61010
  • 浏览: 564695 次
  • 来自: -
博客专栏
63c13ecc-ef01-31cf-984e-de461c7dfde8
libgdx 游戏开发
浏览量:12301
社区版块
存档分类
最新评论

[原创] Android - ListView - 高效Adapter - EfficientAdapter - ListActivity

阅读更多
    在做Android手机应用开发时, ListView是一个非常常用的控件。如何更新的使用它呢?其实SDK中的例子已经非常的完整了,并且能满足大多数的需要。

    如果大家刚开始学习ListView,我建议大家还是直接先看官方的例子好了,这样大家会学到更好的写法以及养成更好的习惯。

    下面就以EfficientAdapter为例,看看官网例子是如何使用ListView的:

    请大家格外注意getView的书写方法,大家可能从网上也能找到过一些其它的例子,但是网上的写法和官网不同,建议大家采用官网例子的写法。

    简要说明:要实现高效的Adapter,需要做两件事:
    1. 重用getView()中的convertView,避免在不必要的时候inflating View。
    2. 使用ViewHolder模式,避免在不必要的时候调用findViewById()。

    顺便再提一句:若继承的是ListActivity,如果在layout xml里定义了ListView,那么该ListView的ID必须是"@id/android:list",最好再包含一个ID是"@id/android:empty"的TextView,供ListView中没有数据时,显示提示文字用。如下所示:
<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:orientation="vertical"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:paddingLeft="8dp"
         android:paddingRight="8dp">

     <ListView android:id="@id/android:list"
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:background="#00FF00"
               android:layout_weight="1"
               android:drawSelectorOnTop="false"/>

     <TextView android:id="@id/android:empty"
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:background="#FF0000"
               android:text="No data"/>
 </LinearLayout>

    官网EfficientAdapter例子如下:

/**
 * Demonstrates how to write an efficient list adapter. The adapter used in this example binds
 * to an ImageView and to a TextView for each row in the list.
 *
 * To work efficiently the adapter implemented here uses two techniques:
 * - It reuses the convertView passed to getView() to avoid inflating View when it is not necessary
 * - It uses the ViewHolder pattern to avoid calling findViewById() when it is not necessary
 *
 * The ViewHolder pattern consists in storing a data structure in the tag of the view returned by
 * getView(). This data structures contains references to the views we want to bind data to, thus
 * avoiding calls to findViewById() every time getView() is invoked.
 */
public class List14 extends ListActivity {

    private static class EfficientAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        private Bitmap mIcon1;
        private Bitmap mIcon2;

        public EfficientAdapter(Context context) {
            // Cache the LayoutInflate to avoid asking for a new one each time.
            mInflater = LayoutInflater.from(context);

            // Icons bound to the rows.
            mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon48x48_1);
            mIcon2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon48x48_2);
        }

        /**
         * The number of items in the list is determined by the number of speeches
         * in our array.
         *
         * @see android.widget.ListAdapter#getCount()
         */
        public int getCount() {
            return DATA.length;
        }

        /**
         * Since the data comes from an array, just returning the index is
         * sufficent to get at the data. If we were using a more complex data
         * structure, we would return whatever object represents one row in the
         * list.
         *
         * @see android.widget.ListAdapter#getItem(int)
         */
        public Object getItem(int position) {
            return position;
        }

        /**
         * Use the array index as a unique id.
         *
         * @see android.widget.ListAdapter#getItemId(int)
         */
        public long getItemId(int position) {
            return position;
        }

        /**
         * Make a view to hold each row.
         *
         * @see android.widget.ListAdapter#getView(int, android.view.View,
         *      android.view.ViewGroup)
         */
        public View getView(int position, View convertView, ViewGroup parent) {
            // A ViewHolder keeps references to children views to avoid unneccessary calls
            // to findViewById() on each row.
            ViewHolder holder;

            // When convertView is not null, we can reuse it directly, there is no need
            // to reinflate it. We only inflate a new View when the convertView supplied
            // by ListView is null.
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.list_item_icon_text, null);

                // Creates a ViewHolder and store references to the two children views
                // we want to bind data to.
                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.text);
                holder.icon = (ImageView) convertView.findViewById(R.id.icon);

                convertView.setTag(holder);
            } else {
                // Get the ViewHolder back to get fast access to the TextView
                // and the ImageView.
                holder = (ViewHolder) convertView.getTag();
            }

            // Bind the data efficiently with the holder.
            holder.text.setText(DATA[position]);
            holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);

            return convertView;
        }

        static class ViewHolder {
            TextView text;
            ImageView icon;
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(new EfficientAdapter(this));
    }

    private static final String[] DATA = {
            "Abbaye de Belloc", "Abbaye du Mont des Cats", "Abertam"};
}

1
1
分享到:
评论

相关推荐

    Android-ListView 实现点击侧边A-Z快速查找.zip

    android studio开发app项目 Android-ListView 实现点击侧边A-Z快速查找 Android-ListView 实现点击侧边A-Z快速查找 Android-ListView 实现点击侧边A-Z快速查找

    Flutter学习之旅(六)----ListView控件自定义Adapter以及带参数跳转

    Flutter学习之旅(六)----ListView控件自定义Adapter以及带参数跳转,博客对应地址:http://blog.csdn.net/zhangxiangliang2/article/details/76383244

    Android-listview与adapter用法最新版本

    本文档主要讲述的是Android-listview与adapter用法;要使用ListView,首先要了解什么是适配器。适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView,后面还会学习其他的)的桥梁,通过它能有效...

    Android-react-native-timeline-listview.zip

    Android-react-native-timeline-listview.zip,React本机应用程序的时间线组件,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。

    MVC-ListView-DataModel-master.zip

    MVC-ListView-DataModel-master.zipMVC-ListView-DataModel-master.zipMVC-ListView-DataModel-master.zipMVC-ListView-DataModel-master.zipMVC-ListView-DataModel-master.zipMVC-ListView-DataModel-master....

    Android-ListView-Example

    这个"Android-ListView-Example"项目显然旨在教你如何在Android应用中有效地使用ListView。以下是对这个主题的详细说明: 1. **ListView的基本概念**:ListView是一个视图容器,它能够显示一组可滚动的项目列表。每...

    Android应用源码之drag-sort-listview-master.rar

    通过研究`drag-sort-listview-master`的源码,开发者不仅可以学习到拖放排序的实现,还可以深入了解Android ListView的工作原理,以及如何优雅地处理触摸事件和视图更新。这对于提升个人的Android开发技能,特别是...

    Android-listview和recycleview的adapter的封装考虑重用性和可读性不过度抽象

    在Android开发中,ListView和RecyclerView是两种常用的列表控件,用于展示大量的数据。适配器(Adapter)是连接数据源和视图的关键组件,它负责将数据转化为用户可见的UI元素。本篇将深入探讨如何在封装ListView和...

    android--ListView下拉刷新demo

    在Android开发中,ListView是一种常见的组件,用于展示大量的列表数据。`ListView`的下拉刷新功能是提升用户体验的重要特性,特别是在处理动态加载数据的应用场景中。这个“android--ListView下拉刷新demo”就是一个...

    Android-ListView中嵌套(ListView)控件兼容问题

    ### Android-ListView中嵌套(ListView)控件兼容问题 #### 背景与问题描述 在Android开发中,有时我们需要在`ListView`中嵌套另一个`ListView`以实现更复杂的用户界面设计。然而,在实际操作过程中可能会遇到一些...

    android-pulltorefresh-listview 下拉刷新ListView

    通过适配器(Adapter)将数据源与ListView绑定,可以实现数据的动态加载和滚动显示。然而,ListView默认并不支持下拉刷新功能,这就需要额外的库来实现。 `android-pulltorefresh`库就是这样一个解决方案。它提供了...

    android-pulltorefresh-listview

    《Android下拉刷新ListView详解——基于android-pulltorefresh库》 在移动应用开发中,用户界面的交互性与用户体验至关重要。其中,下拉刷新功能已成为许多Android应用的标准特性,尤其是在显示列表数据的场景中。`...

    android-listview列表伸缩自定义组件

    总的来说,"android-listview列表伸缩自定义组件"是一项增强用户交互体验的技术,它需要开发者对Android的ListView、Adapter机制、事件监听以及自定义View有深入的理解。实现这个功能不仅可以让应用的界面更加生动,...

    android-ListView分组显示.doc编程资料

    android-ListView分组显示.doc

    Android-ListView上下翻页效果(源码).zip

    Android-ListView上下翻页效果(源码).zip

    5-ListView-SimpleAdapter及自定义Adapter-进阶2.rar

    在Android开发中,ListView是常用的一种视图组件,用于显示多行列表数据。本教程将深入探讨如何使用SimpleAdapter和自定义Adapter与ListView协同工作,以实现数据的动态展示。以下是对相关知识点的详细说明: 1. **...

    安卓listview相关相关-Android--ListView返回第一条数据的实现.rar

    在Android开发中,ListView是一个非常重要的组件,常用于展示大量数据列表。本资源"安卓listview相关相关-Android--ListView返回第一条数据的实现.rar"主要关注如何实现在ListView中快速定位到第一条数据。以下是对...

    android-ListView内嵌GridView

    在Android开发中,ListView和GridView是两种常用的布局控件,它们用于展示大量数据。ListView以其垂直滚动、可复用视图的优势,常用于显示一列数据;而GridView则以网格形式展示,通常用于图片或者小图标等需要均匀...

    Android实现的ListView-ListViewAdapter(新闻列表事例)

    在这个“Android实现的ListView-ListViewAdapter(新闻列表事例)”中,我们将探讨如何利用ListView和ListViewAdapter来构建一个新闻列表,具体涵盖以下几个关键知识点: 1. **ListView**: ListView是Android SDK中的...

Global site tag (gtag.js) - Google Analytics