`

ListView

    博客分类:
  • UI
阅读更多

 

由于手机屏幕尺寸的原因以及手指触屏操作的特性,ListView常常用到。在Android学习笔记(十一):Activity-ListView中,每一个list中的entry只有一个数据,且都只涉及一个view,在本次,我们将学习进一步的变化,让list更为生动,这只需对apdater作进一步的描述。

例子一:每个元素有一个图标和一个信息数据

1)设置主界面的XML文件

<LinearLayout ...>
  <!--  我们需要对list的entry进行地功能之,所以id采用"@android:id/list" -->
  <ListView android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
 />  
</LinearLayout>

2)设置每个元素格式entry.xml格式

<LinearLayout ...>
  <!-- 在每一个元素中(每一行list中),有一个image icon,然后是我们的数据信息 -->
  <ImageView android:id="@+id/c82_icon"
    android:layout_width="44px"
    android:paddingLeft="2px"
    android:paddingRight="2px"
    android:paddingTop ="10px"
    android:layout_height="wrap_content"

    android:src="@drawable/android_normal" />
   <TextView android:id="@+id/c82_label"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textSize="44sp"
 />
</LinearLayout>

3)源代码

源代码很简单,可以参考Android学习笔记(十一):Activity-ListView中的第一个例子。不同的是设置adapter的写法,原来的例子采用了android提供UI格式android.R.layout.simple_list_item_1,在这个例子中我们将采用自定义的layout格式来描述list增个中的元素:

public class Chapter8Test2 extends ListActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chapter_8_test2);

       /* 第一个参数是context,最后一个参数是数据信息来源item,第二个参数是描述entry的layout xml文件,第三个参数是数据信息来源对应元素layout中的哪一个widget。*/
        setListAdapter ( new ArrayAdapter<String>( this,R.layout.entry,R.id.c82_label,Chapter8.items));
    }
    
    public void onListItemClick(ListView parent, View view, int position, long id){
        Toast.makeText(getApplicationContext(), Chapter8.items[position], Toast.LENGTH_SHORT).show(); 
    }

例子二:根据layout xml文件,动态设置每个元素

上面的方式可以处理简单的方式,但是下面两种情况

  • 不是所有的单元都使用同一个layout
  • 需要设置在list单元中的widget,例如使用不同的icon

我们需要创建adapter的子类,通过重写getView()来描述自己的单元风格。在下面的例子中,我们对第一个例子进行修改,对于长短不同的单词,使用不同的icon。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chapter_8_test2);

        setListAdapter(new IconicAdapter());
    }
    
    private class IconicAdapter extends ArrayAdapter<String>{
        /* 步骤1:编写构造函数,对于第一个例子,我们填入格式layout xml文件和数据来源,以便完成必要的初始化工作 */
        IconicAdapter(){
            super(Chapter8Test3.this,R.layout.entry,Chapter8.items);
        }

        /*步骤2:通过重写getView(),具体描述每个元素的格式,输入中position表示list的顺序位置,我们返回的View即使list在position位置的元素的呈现 */
        public View getView(int position, View convertView, ViewGroup parent) {
            /* 步骤2.1:根据layout xml文件,通过LayoutInflater影射到一个View对象,作为我们list元素UI的基础 */
            //LayoutInflater类是用于将layout XML文件实例化为相应的view对象,它从不直接使用,而是使用getLayoutInflater()或者getSystemService(String)来获得已挂在当前context标准的LayoutInflater实例。例如:LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             LayoutInflater infalter = getLayoutInflater();
             //从第一个参数获得相关的XML的结构,第二个参数是ViewGroup root,最后一个参数表示如果有错误,是否扔出InflateException。
             View row=infalter.inflate(R.layout.entry, parentfalse);
             
             /* 步骤2.2:具体设置每个View中各个widget的格式和信息 ,在这个例子中,如果信息长度大于4显示一种图标,小于等于显示另一种图标*/
             TextView label=(TextView)row.findViewById(R.id.c82_label);
             ImageView icon = (ImageView)row.findViewById(R.id.c82_icon);          
             label.setText(Chapter8.items[position]);
             if(Chapter8.items[position].length() > 4){
                 icon.setImageResource(R.drawable.android_focused);
             }else{
                 icon.setImageResource(R.drawable.android_normal);
             }
             /*步骤2.3,返回对应position位置的view */           
             return row;
        }
   }

例子三:让程序更有效率

例子二可以灵活设置每一个list元素的UI,但是在效率方面,每次滑动,都需要根据getView()来获取view,这对于快速移动时,会出现呆滞缓慢的现象,同时每次CPU的计算也消耗手机电池。在getView()中,有一个参数为View convertView,当我们第一次给出这个元素的UI的View时,convertView为零,此后convertView为我们之前所创建的view对象(重复利用,也避免java在garbage收集时消耗CPU[消耗电源])。可以重复利用我们之前创建的View,如果需要对内容进行改变,可以通过findViewById获得对应的widget对象,对内容进行设置,这样UI只刷新设置的部分。下面是例子三对例子二中getView的修改。

        /*为了是程序更有效率,利用之前已经创建的View(即第二个参数),只有第一次显示该元素时,方创建新的View*/
        public View getView(int position, View convertView, ViewGroup parent) {
            View row = convertView;
            //在这个例子中,由于widget的内容不变, 可以在第一次设置中赋值。在本例子中我们按动态显示(需要处理其中的变化),将内容每次都重新设置
            if(row == null){
                LayoutInflater inflater = getLayoutInflater();
                row = inflater.inflate(R.layout.chapter_8_test2_entry,parent,false);
            }     
            TextView label=(TextView)row.findViewById(R.id.c82_label);
            label.setText(Chapter8.items[position]);
            
            ImageView icon = (ImageView)row.findViewById(R.id.c82_icon);
             label.setText(Chapter8.items[position]);
             if(Chapter8.items[position].length() > 4){
                 icon.setImageResource(R.drawable.android_focused);
             }else{
                 icon.setImageResource(R.drawable.android_normal);
             }
        

             return row;
        }

例子四:让程序进一步有效率 setTag( )

在上面的例子,我们重复利用了已创建的View,但是findViewById需要在View的层次中寻找,如果View的结构复杂,同样也是消耗CPU的。此外对于每个List元素,在实际的程序中,list元素可能还会存储某些数据。在这个例子,我们引入setTag()和getTag()两个方法。每个View都可以通过setTag()绑带一个object,可以通过getTag()将这个object取出来,这样可以避免findViewById对widget的层层查询,做到快速定位。

//步骤一:设置一个class用来存储list元素的信息
    class ViewWrapper{
        View base;
        TextView label = null;
        ImageView icon = null;
        
        ViewWrapper(View base){
            this.base = base;
        }
        
        TextView getLabel(){
            if(label == null)
                label = (TextView)base.findViewById(R.id.c82_label);
            return label;
        }
        
        ImageView getIcon(){
            if(icon == null)
                icon = (ImageView)base.findViewById(R.id.c82_icon);
            return icon;
        }
    }
   
   ... ...余下内容同例子2和例子3,我们重写IconicAdapter的getView()

        public View getView(int position, View convertView, ViewGroup parent) {
            View row = convertView;
            ViewWrapper wrapper = null;
            //步骤2:如果没有创建View,创建之,并通过setTag()捆绑ViewWrapper对象,如果已经创建,通过getTag()获取ViewWrapper对象。
            if(row == null){
                LayoutInflater inflater = getLayoutInflater();
                row = inflater.inflate(R.layout.chapter_8_test2_entry,parent,false);
                wrapper = new ViewWrapper(row);
                row.setTag(wrapper);
            }else{
                wrapper = (ViewWrapper) row.getTag();
            }
            
            wrapper.getLabel().setText(Chapter8.items[position]);        
             if(Chapter8.items[position].length() > 4){
                 wrapper.getIcon().setImageResource(R.drawable.android_focused);
             }else{
                 wrapper.getIcon().setImageResource(R.drawable.android_normal);
             }
        
             return row;
        }
    }

分享到:
评论

相关推荐

    android的listview嵌套listview,列表嵌套列表 android studio版本

    在Android开发中,ListView是一种常用的视图组件,用于展示大量数据列表。当需求涉及列表中的每个条目本身也需要展示一个子列表时,我们就会遇到ListView的嵌套问题。本教程将详细讲解如何在Android Studio环境下...

    ListView嵌套ListView全选,多选

    在Android开发中,ListView是一种常用的UI组件,用于展示大量数据列表。当需要在ListView中实现更复杂的布局,比如一个ListView嵌套另一个ListView时,我们可能会遇到“全选”和“多选”的需求。这个场景常见于例如...

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

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

    C# ListView使用例子ListView排列方式演示

    在C#编程中,ListView控件是一个非常常用的组件,它用于显示数据集合,并且提供了多种视图模式,如图标、小图标、详细信息等。在这个"C# ListView使用例子ListView排列方式演示"中,我们将深入探讨如何利用ListView...

    listview添加图片按钮 及按钮跟ListView双监听

    在Android开发中,ListView是一种常用的UI组件,用于展示大量数据列表。在实际应用中,我们经常需要对ListView进行自定义,比如在每个列表项中添加图片和按钮,以增加交互性和功能多样性。本文将深入探讨如何在...

    vb ListView 可编辑

    在VB(Visual Basic)编程环境中,ListView控件是一种常用且功能强大的组件,它允许开发者以列表形式展示数据。在默认情况下,ListView控件通常只支持读取操作,但通过一些扩展和自定义,我们可以实现其列数据的编辑...

    ListView的嵌套,动态设置ListView的高度

    在Android开发中,ListView是一种常见的视图组件,用于展示大量数据列表。然而,在某些复杂的界面设计中,我们可能需要在一个ListView中嵌套另一个ListView,这就涉及到"ListView嵌套"的技术。这种技术可以用来构建...

    ListView下拉更新功能

    ListView是Android平台上常见的一种列表控件,用于展示大量数据的列表形式。在移动应用开发中,为了提升用户体验,经常需要实现类似微博那样可以下拉刷新的功能。本教程将详细介绍如何在Android中实现ListView的下拉...

    listview的小demo

    ListView是Android平台上一个非常重要的控件,主要用于展示大量的数据列表,具有良好的滚动性能和可定制性。本笔记将深入探讨ListView的基本使用,帮助初学者掌握这个控件的关键知识点。 一、ListView的基本结构 ...

    WPF ListView 漂亮样式

    在Windows Presentation Foundation (WPF) 中,ListView 是一个强大的控件,用于展示数据集合,并提供了多种自定义样式和布局选项,使得用户界面更加美观和功能丰富。本教程将深入探讨如何利用WPF ListView 创建漂亮...

    C# Listview固定列宽

    在C#编程中,`ListView`控件是一个常用的组件,常用于显示数据集中的行和列,类似于电子表格。在某些场景下,我们可能需要固定`ListView`的列宽,防止用户手动调整列宽,以保持界面的一致性和美观性。标题"**C# ...

    VBA实战系列(ListView控件)

    ### VBA实战系列(ListView控件) #### 一、概述 在Excel VBA开发中,ListView控件是一种非常强大的工具,它可以用来展示大量的结构化数据,并且具备良好的可定制性和美观性。对于需要处理大量数据并希望有良好用户...

    改变ListView网格颜色

    在VB(Visual Basic)编程中,ListView控件是常见的数据展示组件,用于显示列表或表格形式的数据。在某些情况下,为了提升用户界面的美观度和可读性,开发者可能需要自定义ListView的显示效果,例如改变网格的颜色。...

    viewpage嵌套listview,效果:滑动listview删除,滑动非listview区域viewpage翻页

    标题"viewpage嵌套listview,效果:滑动listview删除,滑动非listview区域viewpage翻页"描述的就是这样一个功能:在ViewPager中嵌套了一个ListView,ListView支持滑动删除,而当滑动到ListView之外的区域时,...

    C#使用listView增删操作实例

    在C#编程中,ListView控件是一个非常常用的组件,它允许开发者在窗口或者对话框上显示数据列表。这个控件可以展示多列数据,并且支持多种操作,如增删、选择和排序。在这个实例中,我们将深入探讨如何使用C#进行...

    WPF的ListView控件自定义布局用法实例

    在WPF中,ListView控件是一个非常常用的组件,它用于展示数据集合,并提供了多种布局方式。自定义布局允许开发者根据需求灵活设计ListView显示的内容和样式。本实例将深入讲解如何在WPF中自定义ListView控件的布局。...

    ListView中添加CheckBox

    1、ListView item中加入checkbox后onListItemClick 事件无法触发。 原因:checkbox的优先级高于ListItem于是屏蔽了ListItem的单击事件。 解决方案:设置checkbox的android:focusable="false" 2、选择其中的...

    Android listview自动换行

    在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。它的高效性和可滚动性使得它在显示数据集合时十分有用。然而,当ListView的子项(item)宽度超过屏幕宽度时,如何实现自动换行就成了一个...

    C# ListView添加行距(ListView 添加行间距)源代码

    C# ListView添加行距 源代码 ListView添加行距 一、问题 listview控件,可以实现增大行距吗?行与行太紧了,不好看呀。 有办法可以实现吗? 我不想通过加大字体的方法,因为字体大了,行距还是近呀。 我要的是增大行...

Global site tag (gtag.js) - Google Analytics