`
砺雪凝霜
  • 浏览: 156374 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android中listView如何复用多种布局

阅读更多

                          android中listView如何复用多种布局

      我们都知道,当listView的item比较多的时候,会利用convertView对每个item进行缓存

      但是这还不够,当我们的每个item布局中的控件比较多的时候,我们还会用ViewHolder对每个item布局中的view进行缓存,达到减少调用findViewById的次数目的,这样会让你的listView的滑动的时候会比较顺畅。

      viewHolder复用一个布局的话,我相信谁都会,但是现实开发中往往我们会复用多个布局,这个时候我们该如何实现呢?

 

adapter填充数据的时候,我们一般要实现以下方法:

1  public int getCount(){ }

2  public Object getItem(int position) {}

3  public long getItemId(int position) {}

4  public View getView(int position, View view, ViewGroup viewGroup){}

 

但是要实现复用多种布局的话我们还要实现下面2个方法  
   1 public int getItemViewType(int position) {}

     返回我们要复用的布局类型,假如我们要复用一个tab结构和item结构,我们可以这么来写

     类别的数值在(0,类别总数-1)之间

 

 

  public static final int TYPE_UNKNOW = 0;
  public static final int TYPE_TAB = 1;
  public static final int TYPE_LIST_ITEM = 2;
  public static final int TYPE_MAX_COUNT = 3;
@Override
    public int getItemViewType(int position) {
        //复用tab结构   
        if (position == 1) {
            return TYPE_TAB;
        }
       //复用一般的item结构
        int size = CollectionUtils.size(feedDataList);
        if (position >= 1 && size > 0 && position < (size + 2)) {
            return TYPE_LIST_ITEM;
        }
        return TYPE_UNKNOW;
    }

  类别总数是3,类别对应的int值应该在0 - 2 之间,它们分别是

 

    public static final int TYPE_UNKNOW = 0;
    public static final int TYPE_TAB = 1;
    public static final int TYPE_LIST_ITEM = 2;
 

 

 

2  public int getViewTypeCount() {  } 返回复用布局的总数,这里是3

 

 @Override
    public int getViewTypeCount() {
        return TYPE_MAX_COUNT;
    }

 

 

 

在adapter中的getView方法中,我们就可以这样来写:

 

 @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ItemViewHolder itemViewHolder;
        TabViewHolder tabViewHolder;
        int viewType= getItemViewType(position);
        switch (viewType) {
            case TYPE_TAB:
                if(convertView == null ) {
                    tabViewHolder = new TabViewHolder(mContext);
                    //给contenView赋值,并给viewHolder设置tag
                    tabViewHolder.findView(position,convertView,viewGroup);
                }else{
                    //直接复用
                    tabViewHolder =  (TabViewHolder)convertView.getTag();
                }
                //这里是处理业务逻辑的方法 
                tabViewHolder.setView(position);
                return tabViewHolder.layout;//返回convertView 
            case TYPE_LIST_ITEM:
                if (convertView == null) {
                    itemViewHolder = new ItemViewHolder(mContext);
                   //给contenView赋值,并给viewHolder设置tag
                    itemViewHolder.findView(position, convertView, viewGroup);
                } else {
                   //convertView不为空,直接复用
                    itemViewHolder = (ItemViewHolder) convertView.getTag();
                }
                //处理业务逻辑
                itemViewHolder.setView((FeedComment)getItem(position));
                return itemViewHolder.layout;//返回convertView 
            case TYPE_UNKNOW:
                return null;
        }
        return null;
    }

 说明:处理复用多个布局的时候,如果不调用上面getViewTypeCount()和getItemType(),很容易就出现viewHolder类型转换错误。因为在屏幕滚动的时候,view.getTag()返回的viewHolder有2种,我们拿到的viewHolder可能就不是理想中的viewHolder,这个时候类型转换错误就出现了。

 

 

       

 

 

 

    

分享到:
评论

相关推荐

    在Android中ListView多种Item布局的实现

    总的来说,实现Android中ListView多种Item布局的关键在于自定义BaseAdapter,并在`getView()`方法中根据数据动态决定使用哪种布局。聊天界面的实现则需要考虑消息的发送与接收,根据数据的不同属性调整布局样式。这...

    Android listview动态加载不同布局

    1. **创建多种布局**:首先,为每种不同的数据类型或状态创建对应的XML布局文件。例如,如果一个列表既要显示文本又要显示图片,我们可以创建一个包含ImageView和TextView的布局;另一种情况可能只需要TextView。 2...

    Android中ListView多种Item布局的实现

    本篇将深入探讨如何在Android中实现一个模拟聊天界面的ListView,其中包含两种不同的Item布局:一种用于显示发送的消息,另一种用于显示接收的消息。 首先,我们需要理解ListView的基本工作原理。ListView依赖于...

    ListView加载多种布局

    然而,有些情况下我们不仅需要展示单一类型的条目,还可能需要在同一个ListView中混合显示多种布局。本教程将详细讲解如何在ListView中实现这种功能。 首先,我们需要理解ListView的工作原理。ListView通过Adapter...

    解决Android ListView滚动布局错位

    综上所述,解决Android ListView滚动布局错位的关键在于正确地管理视图类型,并在`getView()`方法中确保视图的复用符合数据的类型。同时,实现多布局时要保持逻辑清晰,避免混淆不同类型的视图。通过这些方法,你...

    Android中ListView的使用

    在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据的列表,具有滚动和复用视图(ViewHolder模式)的特性,极大地提高了性能。这篇博客将深入探讨ListView的使用,包括基本设置、数据适配器、...

    Android中ListView包含多个Item

    综上所述,Android中的ListView是一个强大且灵活的组件,通过适配器和自定义布局,我们可以轻松地创建包含多种类型Item的列表,同时通过各种优化手段提高用户体验。在实际开发中,应根据需求选择合适的Adapter实现...

    android 修改listview的不同item字体的颜色

    在Android开发中,ListView是一种常用的组件,用于展示大量的列表数据。在实际应用中,我们经常需要根据需求定制ListView,比如改变不同列表项(item)的字体颜色。标题"android 修改listview的不同item字体的颜色...

    android中一个简单的LIstView用法例子

    在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据列表,通常用于实现滚动效果。这个简单的ListView用法例子将帮助初学者理解和掌握如何在实际项目中运用ListView。 首先,我们来了解一下...

    android 一些listview例子

    在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据集合,并且支持滚动操作。在"android 一些listview例子"这个主题中,我们将会深入探讨ListView的各种使用方法和优化策略。 首先,ListView的...

    android SQlite、listView中加按钮的使用

    1. 自定义Adapter:你需要继承BaseAdapter或者ArrayAdapter,并重写其中的方法,如getView(),在这个方法中你可以创建并设置ListView每一项的布局,包括按钮。 2. 设置按钮事件:在getView()方法中,找到Button组件...

    Android新闻类界面分享(多种布局的listview)

    综上所述,"Android新闻类界面分享(多种布局的listview)"项目涉及到的核心技术包括自定义Adapter、PopupWindow的使用以及在ListView中处理多种布局。通过这些技术的综合运用,我们可以创建一个功能齐全、体验良好的...

    RecyclerView 加载复杂多个多种布局,完美解决控件复用等等问题

    在Android开发中,RecyclerView是一个非常重要的视图组件,它用于展示可滚动的列表,具有高效的数据处理和视图复用机制。本篇文章将深入探讨如何使用RecyclerView加载复杂的多个多种布局,以及如何解决控件复用等...

    Android 中ListView的应用

    在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据列表,通常用于实现像通讯录、消息列表等效果。ListView的高效利用是优化用户体验的关键,因为它能够动态加载数据,只渲染屏幕可见的部分,从而...

    Android ListView实现各种版面设计功能 源码

    4. **多种布局类型**:ListView支持多种布局类型,如单行布局、两行布局、网格布局等。通过自定义Adapter,你可以根据数据的不同类型或者用户的选择,动态地改变列表项的布局。例如,可以使用LinearLayout、...

    Android中listView的讲解

    在Android开发中,ListView是一个非常重要的控件,用于展示大量数据的列表形式。它通过复用视图(View)来高效地渲染大量项,从而节省内存并提高性能。本讲解将深入探讨ListView的使用方法、核心组件以及如何优化其...

    android Listview demo

    在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据集合,并且支持滚动操作。本教程通过一个名为"ListApp"的示例项目,详细介绍了如何在Android中使用ListView来构建用户界面并实现基本的功能。 ...

    android ListView中EditText被选中时弹出键盘会丢失EditText的焦点

    1. **设置ListView的descendantFocusability**:在ListView的XML布局中,可以设置`descendantFocusability`属性为`blocksDescendants`或`beforeDescendants`。这将使ListView允许或优先获取焦点,防止ListView在软...

    android-ListView

    1. **复用View**:ListView的复用机制是提高性能的关键,通过convertView参数在`getView()`方法中重用不再可见的View,避免频繁创建新对象。 2. **大数据量优化**:当数据量过大时,可以使用分页加载,只加载一部分...

    ListView Item多布局的实现

    接下来,我们需要创建一个自定义的Adapter来处理多种布局。这个Adapter需要继承自`BaseAdapter`类,重写其中的关键方法。自定义Adapter的核心是`getView()`方法,这里会根据数据项的类型来决定使用哪种布局。为此,...

Global site tag (gtag.js) - Google Analytics