首页 > 其他分享 >Listview中显示不同的视图布局

Listview中显示不同的视图布局

时间:2023-04-06 21:39:26浏览次数:42  
标签:return int 布局 视图 convertView import android Listview TYPE


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;
  }
}



标签:return,int,布局,视图,convertView,import,android,Listview,TYPE
From: https://blog.51cto.com/u_5454003/6174156

相关文章

  • 横向滑动的ListView
    我通常把GridView设置成1行来代替横向的listview了,呵呵。下面这个类留着以后试试。publicclassHorizontalListViewextendsAdapterView<ListAdapter>{publicbooleanmAlwaysOverrideTouch=true;protectedListAdaptermAdapter;privateint......
  • 运用手势操作ListView中的Item
    如下面这个图:需要实现的功能是:用手指在某条记录上从左往右划一下,出现一条横线,用于表示这个菜已经上过了;倒过来划,取消这条横线,表示这个菜没上过。如何实现呢?看我的吧!首先需要一个Item的布局,在布局的最上方有一个ImageView用于显示这条横线,如果没有就把这个I......
  • 分别设置listview加载中、空数据、加载数据失败三种状态的显示
    设置listview加载中,空数据,加载数据失败三种状态的显示.基本用法:importjava.util.ArrayList;importjava.util.Arrays;importcom.kanak.emptylayout.EmptyLayout;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnCl......
  • 在ListView上滑动显示Delete按钮
    SwipeLayout实现listview滑动删除功能http://www.devstore.cn/code/info/579.html首先设置listView.setOnTouchListener(onTouchListener);listView=(ListView)findViewById(R.id.listView);listView.setOnItemClickListener(onItemClickListener);li......
  • 可左右两侧挤压傍边布局的Android抽屉
    我参考了这篇文章,我将它改了一下:可动态布局的Android抽屉之基础工程中需要这样的效果,左边和右边的Panel可以打开关闭:我把左边和右边的Panel封装成2个类了。这里要特别注意,抽屉是需要“handler”的,我这里可以把任何View都看成“handler”,使用setBindView(Vie......
  • ListView之setEmptyView的问题
    使用listView或者gridView时,当列表为空时,有时需要显示一个特殊的emptyview来提示用户,一般情况下,如果你是继承ListActivity,只要<ListViewandroid:id="@id/android:list".../><TextViewandroid:id="@id/android:empty.../>当列表为空时就会自动显示Tex......
  • 船舶的布局问题学习
    船舶的布局问题学习​ 船舶的布局问题包括许多小的布局类问题,包括船舶机舱设备的布局问题、船舶管路的布局问题、船舶舱室内属具的布局问题和船舶舱室划分布局问题等。船舶机舱设备的布局问题​ 船舶机舱设备布局设计属于密闭有限空间多目标优化设计问题,作为船舶的心脏,机舱设备......
  • element-plus中Container 布局容器左右留白
    index.vue代码如下:<scriptlang="ts"setup></script><template><el-containerclass="layout"><el-asideclass="aside"width="200px">Aside</el-aside><el-contain......
  • Java笔记(10) GUI->布局
    这里介绍3种布局:FlowLayout流式布局BorderLayout边界布局GridLayout网格布局FlowLayout/*MyFrame定义见Java笔记9,这里添加了事件监听方法*/publicclassTestFlowLayout{publicstaticvoidmain(String[]args){MyFramemyFrame=newMyFram......
  • 移动端响应式布局
    实现响应式布局开发的步骤寻找参照的比例(例如设计稿的比例),在这个比例下给网页的字体设置一个初始值,便于计算可以设置为100px,不可以设置为12px以下的,因为浏览器最小字体为12px,如果设置为10px则会按照12px进行计算。未来我们要把设计稿中测量出来的尺寸(px)转换为REM单位去设置样式......