`

Listview中显示不同的视图布局

阅读更多
1.使用场景

  在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能。convertView在Item为单一的同种类型布局时,能够回收并重用,但是多个Item布局类型不同时,convertView的回收和重用会出现问题。比如有些行为纯文本,有些行则是图文混排,这里纯文本行为一类布局,图文混排的行为第二类布局。单一类型的ListView很简单,下面着重介绍一下ListView包含多种类型视图布局的情形。

2.ListView包含不同Item的布局

  我们需要做这些工作:

  1)重写 getViewTypeCount() – 该方法返回多少个不同的布局

  2)重写 getItemViewType(int) – 根据position返回相应的Item

  3)根据view item的类型,在getView中创建正确的convertView

3.案例
import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

public class listViewTest extends Activity {
/** Called when the activity is first created. */
  ListView listView;
  MyAdapter listAdapter;
  ArrayList<String> listString;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    listView = (ListView)this.findViewById(R.id.listview);
    listString = new ArrayList<String>();
    for(int i = 0 ; i < 100 ; i++)
    {
      listString.add(Integer.toString(i));
    }
    listAdapter = new MyAdapter(this);
    listView.setAdapter(listAdapter);
  }

  class MyAdapter extends BaseAdapter{
    Context mContext;
    LinearLayout linearLayout = null;
    LayoutInflater inflater;
    TextView tex;
    final int VIEW_TYPE = 3;
    final int TYPE_1 = 0;
    final int TYPE_2 = 1;
    final int TYPE_3 = 2;

    public MyAdapter(Context context) {
      // TODO Auto-generated constructor stub
      mContext = context;
      inflater = LayoutInflater.from(mContext);
    }

    @Override
    public int getCount() {
      // TODO Auto-generated method stub
      return listString.size();
    }

    //每个convert view都会调用此方法,获得当前所需要的view样式
    @Override
    public int getItemViewType(int position) {
      // TODO Auto-generated method stub
      int p = position%6;
      if(p == 0)
        return TYPE_1;
      else if(p < 3)
        return TYPE_2;
      else if(p < 6)
        return TYPE_3;
      else
        return TYPE_1;
    }

    @Override
    public int getViewTypeCount() {
      // TODO Auto-generated method stub
      return 3;
    }

    @Override
    public Object getItem(int arg0) {
      // TODO Auto-generated method stub
      return listString.get(arg0);
    }

    @Override
    public long getItemId(int position) {
      // TODO Auto-generated method stub
      return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      viewHolder1 holder1 = null;
      viewHolder2 holder2 = null;
      viewHolder3 holder3 = null;
      int type = getItemViewType(position);

      //无convertView,需要new出各个控件
      if(convertView == null)
      { 
        Log.e("convertView = ", " NULL");

        //按当前所需的样式,确定new的布局
        switch(type)
        {
        case TYPE_1:
          convertView = inflater.inflate(R.layout.listitem1, parent, false);
          holder1 = new viewHolder1();
          holder1.textView = (TextView)convertView.findViewById(R.id.textview1);
          holder1.checkBox = (CheckBox)convertView.findViewById(R.id.checkbox);
          Log.e("convertView = ", "NULL TYPE_1");
          convertView.setTag(holder1);
          break;
        case TYPE_2:
          convertView = inflater.inflate(R.layout.listitem2, parent, false);
          holder2 = new viewHolder2();
          holder2.textView = (TextView)convertView.findViewById(R.id.textview2);
          Log.e("convertView = ", "NULL TYPE_2");
          convertView.setTag(holder2);
          break;
        case TYPE_3:
          convertView = inflater.inflate(R.layout.listitem3, parent, false);
          holder3 = new viewHolder3();
          holder3.textView = (TextView)convertView.findViewById(R.id.textview3);
          holder3.imageView = (ImageView)convertView.findViewById(R.id.imageview);
          Log.e("convertView = ", "NULL TYPE_3");
          convertView.setTag(holder3);
          break;
        }
      }else{
        //有convertView,按样式,取得不用的布局
        switch(type)
        {
        case TYPE_1:
          holder1 = (viewHolder1) convertView.getTag();
          Log.e("convertView !!!!!!= ", "NULL TYPE_1");
          break;
        case TYPE_2:
          holder2 = (viewHolder2) convertView.getTag();
          Log.e("convertView !!!!!!= ", "NULL TYPE_2");
          break;
        case TYPE_3:
          holder3 = (viewHolder3) convertView.getTag();
          Log.e("convertView !!!!!!= ", "NULL TYPE_3");
          break;
        }
      }

    //设置资源
      switch(type)
      {
        case TYPE_1:
          holder1.textView.setText(Integer.toString(position));
          holder1.checkBox.setChecked(true);
          break;
        case TYPE_2:
          holder2.textView.setText(Integer.toString(position));
          break;
        case TYPE_3:
          holder3.textView.setText(Integer.toString(position));
          holder3.imageView.setBackgroundResource(R.drawable.icon);
          break;
      }

      return convertView;
    }
  }

  //各个布局的控件资源
  class viewHolder1{
    CheckBox checkBox;
    TextView textView;
  }

  class viewHolder2{
    TextView textView;
  }

  class viewHolder3{
    ImageView imageView;
    TextView textView;
  }
}

http://www.cnblogs.com/devinzhang/archive/2012/07/02/2573554.html
分享到:
评论
1 楼 xinsheng_2013 2013-09-06  
nice 大神

相关推荐

    ListView中显示不同的视图布局实现重用Demo

    这个"ListView中显示不同的视图布局实现重用Demo"是专门针对ListView的一种优化技术,它允许开发者在同一个ListView中展示不同类型的视图布局,同时实现视图复用,提高性能。在Android应用设计中,这种技术对于创建...

    ListView下显示不同的布局视图

    标题“ListView下显示不同的布局视图”揭示了如何在同一个ListView中灵活地展示不同类型的视图,这在处理复杂数据集时非常有用。描述中提到,这个示例将展示三种布局来呈现三个集合的数据,这通常涉及到自定义适配器...

    listview中显示不同的视图布局

    然而,在某些场景下,我们可能需要在一个ListView中显示不同类型的数据,这就涉及到“显示不同的视图布局”这一主题。下面我们将详细探讨如何在ListView中实现这个功能。 首先,我们要理解ListView的工作原理。...

    android listView中显示不同的布局

    在许多场景下,开发者需要在ListView中显示不同的布局,比如在一个消息列表中,上行消息与下行消息的布局可能不同,这就是所谓的“聊天布局”。本篇将详细介绍如何在Android的ListView中实现这种功能,并基于提供的...

    Android Listview中显示不同的视图布局详解及实例代码

    在这种情况下,我们就需要用到ListView中显示不同视图布局的功能。 1. **使用场景** 当你需要在一个ListView中展示不同类型的数据,例如,每5个普通文本项后面跟一个带图片和标题的项,这种需求就需要自定义...

    android ListView 网格布局

    本文将深入探讨如何在Android中实现一个基于ArrayAdapter的网格布局ListView。 首先,我们要了解ListView的基本结构。ListView是由多个列表项(List Item)组成的,每个列表项通常对应一个View。在Android中,我们...

    listview加载不同布局

    标题“listview加载不同布局”指的是在同一个ListView中,根据数据的不同类型或者不同状态,动态加载不同的布局文件,以实现更丰富的显示效果。这样的功能通常应用于新闻列表、电商商品列表等场景,每个条目可能需要...

    Android listview动态加载不同布局

    "Android listview动态加载不同布局"这一主题,主要涉及如何在ListView中根据不同的数据类型或者状态显示不同的视图(View)布局,提升用户体验并优化性能。 首先,要实现ListView动态加载不同布局,我们需要理解...

    ListView加载不同布局.zip

    本教程将详细解释如何在ListView中实现加载不同布局,即“图片文字”与“纯文字”布局交替显示。 首先,我们需要了解ListView的工作原理。ListView通过Adapter类来绑定数据和视图。Adapter就像一个桥梁,连接数据源...

    android 在listview的item中显示不同的布局信息

    在实际应用中,我们经常需要在ListView的每个Item中显示不同的布局信息,以满足多样化的设计需求。这通常涉及到自定义Adapter和LayoutInflater的使用。本篇文章将深入探讨如何在ListView的Item中实现不同布局的显示...

    ListView显示数据视图

    在Android开发中,ListView是一种非常常见且重要的控件,它被广泛用于显示大量的数据视图,尤其是在处理数据库数据时。ListView允许用户滚动查看多个条目,优化内存使用,提高用户体验。本节将深入探讨如何使用...

    Android ListView加载不同布局.解决异常ClassCastException

    总结,处理ListView加载不同布局时,我们需要理解ListView的视图复用机制,自定义Adapter并实现`getView()`方法,正确处理不同类型的视图,避免`ClassCastException`异常。同时,使用ViewHolder模式和类型安全的强转...

    Android ListView使用不同对象加载不同布局

    在某些场景下,我们可能需要为ListView的每个Item加载不同的布局,以实现更复杂的显示效果。本篇将详细讲解如何在ListView中根据不同的对象加载不同的布局。 首先,我们要明白ListView的工作原理。ListView通过...

    listview点击item显示隐藏布局

    这个需求在标题和描述中提到的就是“listview点击item显示隐藏布局”,这涉及到ListView的适配器(Adapter)以及点击事件监听(OnItemClickListener)的应用。 首先,我们要创建一个自定义的Adapter,用于填充...

    ListView加载多个布局

    然而,标题"ListView加载多个布局"表明我们讨论的是如何在一个ListView中加载并显示不同的视图类型。这通常是通过在ListView中实现自定义适配器(Adapter)来完成的,以满足复杂的数据结构和界面需求。下面将详细...

    Android ListView adapter不同布局

    然而,有时我们需要在同一个ListView中显示具有不同布局的项,这通常涉及到自定义Adapter的使用。"Android ListView adapter不同布局"这个主题就是关于如何在ListView中实现这样的功能。 首先,我们了解ListView的...

    listView中多个listItem布局时,convertView缓存及使用

    ListView的Adapter中的`getView()`方法负责创建或复用listItem视图。在这个方法里,开发者首先检查传入的convertView是否为空,如果非空,就说明可以复用,然后根据数据来更新视图的内容;如果为空,就需要创建一个...

    ListView实现两种布局

    本示例将深入讲解如何在ListView中实现两种不同的布局,以创建一个类似聊天界面的应用,其中包含上行和下行的消息显示方式。这种技术有助于提升用户体验,因为它使得用户能够清晰地区分不同方向的信息流动。 首先,...

    ListView上拉隐藏头布局 下拉显示

    `ListView上拉隐藏头布局 下拉显示`的实现涉及到自定义ListView头部视图的交互效果,这种效果常见于电商平台的筛选界面,如淘宝的最新版本。这个设计使得用户在下拉时可以显示额外的筛选选项或功能,而上拉则会隐藏...

Global site tag (gtag.js) - Google Analytics