Listview实现不同类型的布局

打开各种客户端发现 Listview的布局多种多样,在我以前的认知中listview不是只能放一种item布局嘛,我就震惊了,现在我自己的项目上要用到这种方式那么就去做下

原理是listview 的adapter中 有这两个方法

// 返回当前布局的样式type
    @Override
    public int getItemViewType(int position) {
        return listDatas.get(position).type;
    }

    // 返回你有多少个不同的类型的数量
    @Override
    public int getViewTypeCount() {
        return 3;
    }

过程 1 定义一个javabeen对象

package com.example.listviewdemo;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Ace on 2016/2/13.
 */
public class lIstViewItem {
    // 用于区分listview显示的不同item,告诉适配器我这是什么类型,listview适配器根据type决定怎么显示
    public int type;
    // 将要显示的数据用HashMap包装好
    public HashMap<String, Object> map;

    public lIstViewItem(int type, HashMap<String, Object> map) {
        this.type = type;
        this.map = map;
    }
}

2 把数据封装在泛型是我们JAVABeen对象的的数组里

package com.example.listviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * Created by Ace on 2016/2/13.
 */

public class MainActivity extends Activity {
    private ListView listView; // 页面listview
    private ListViewAdapter listViewAdapter; // listview适配器
    private ArrayList<lIstViewItem> viewItemsArraylist; // Arraylist主要装载的是传给适配器的数据集合

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initView();
        // 为listview设置适配器
//        ListViewAdapter listViewAdapter = new ListViewAdapter(MainActivity.this, getDatas());

    }

    private void initData() {

    }

    // 初始化页面组件及一些布局
    private void initView() {
        listView = (ListView) this.findViewById(R.id.listview);
        listViewAdapter = new ListViewAdapter(MainActivity.this, getDatas());
        listView.setAdapter(listViewAdapter);
    }

    /**
     * 这里我们用三种不同的样式进行测试
     **/
    private ArrayList<lIstViewItem> getDatas() {

        viewItemsArraylist = new ArrayList<lIstViewItem>();
        viewItemsArraylist.add(new lIstViewItem(2, getHashMapThirdType("美人鱼", "没有买卖就没有杀害", "2016-2-13")));
        viewItemsArraylist.add(new lIstViewItem(1, getHashMapSecondType("单身狗", "情人节自己过")));
        viewItemsArraylist.add(new lIstViewItem(0, getHashMapFirstType("周杰伦")));
        viewItemsArraylist.add(new lIstViewItem(0, getHashMapFirstType("周星驰")));
        viewItemsArraylist.add(new lIstViewItem(1, getHashMapSecondType("猴子", "齐天大圣孙悟空")));

        return viewItemsArraylist;
    }

    // 第一种样式,只传输一个数据
    private HashMap<String, Object> getHashMapFirstType(String firstTheme) {
        HashMap<String, Object> hashMap = new HashMap<String, Object>();
        hashMap.put("Theme", firstTheme);
        return hashMap;
    }

    // 第二种样式,传输两个数据
    private HashMap<String, Object> getHashMapSecondType(String secondTheme, String secondContent) {
        HashMap<String, Object> hashMap = new HashMap<String, Object>();
        hashMap.put("Theme", secondTheme);
        hashMap.put("Content", secondContent);
        return hashMap;
    }

    // 第三种样式,传输三个数据
    private HashMap<String, Object> getHashMapThirdType(String threeTheme, String threeContent, String date) {
        HashMap<String, Object> hashMap = new HashMap<String, Object>();
        hashMap.put("Theme", threeTheme);
        hashMap.put("Content", threeContent);
        hashMap.put("Date", date);
        return hashMap;
    }

}

adapter中设置我们现实的条目

package com.example.listviewdemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by Ace on 2016/2/13.
 */
public class ListViewAdapter extends BaseAdapter {
    private LayoutInflater mLayoutInflater;
    private Context context;
    private ArrayList<lIstViewItem> listDatas;

    public ListViewAdapter(Context context, ArrayList<lIstViewItem> listDatas) {
        this.listDatas = listDatas;
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    } 

    // 返回当前布局的样式type
    @Override
    public int getItemViewType(int position) {
        return listDatas.get(position).type;
    }

    // 返回你有多少个不同的类型的数量
    @Override
    public int getViewTypeCount() {
        return 3;
    }

    @Override
    public int getCount() {
        return listDatas.size();
    }

    @Override
    public Object getItem(int position) {
        return listDatas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        lIstViewItem listItem = listDatas.get(position);
        int Type = getItemViewType(position);//拿到当前条目的类型
        ViewHolderfirstType viewHolderfirstType = null;
        ViewHoldersecondType viewHoldersecondType = null;
        ViewHolderThirdType viewHolderThirdType = null;
        if (convertView == null) {//对类型进行判断
            switch (Type) {
            case 0:
                viewHolderfirstType = new ViewHolderfirstType();
                convertView = mLayoutInflater.inflate(R.layout.activity_first_type_item, null);
                viewHolderfirstType.tv_first_theme = (TextView) convertView.findViewById(R.id.tv_first_theme);
                viewHolderfirstType.tv_first_theme.setText(listItem.map.get("Theme").toString());
                convertView.setTag(viewHolderfirstType);

                break;
            case 1:
                viewHoldersecondType = new ViewHoldersecondType();
                convertView = mLayoutInflater.inflate(R.layout.activity_sencond_type_item, null);
                viewHoldersecondType.tv_second_content = (TextView) convertView.findViewById(R.id.tv_second_content);
                viewHoldersecondType.btn_second_theme = (Button) convertView.findViewById(R.id.btn_second_theme);
                viewHoldersecondType.tv_second_content.setText(listItem.map.get("Theme").toString());
                viewHoldersecondType.btn_second_theme.setText(listItem.map.get("Content").toString());
                 convertView.setTag(viewHoldersecondType);

                break;
            case 2:

                viewHolderThirdType = new ViewHolderThirdType();
                convertView = mLayoutInflater.inflate(R.layout.activity_third_type_item, null);
                viewHolderThirdType.tv_three_content = (TextView) convertView.findViewById(R.id.tv_three_content);
                viewHolderThirdType.et_three_theme = (EditText) convertView.findViewById(R.id.et_three_theme);
                viewHolderThirdType.tv_three_time = (TextView) convertView.findViewById(R.id.tv_three_time);
                viewHolderThirdType.et_three_theme.setText(listItem.map.get("Theme").toString());
                viewHolderThirdType.tv_three_content.setText(listItem.map.get("Content").toString());
                viewHolderThirdType.tv_three_time.setText(listItem.map.get("Date").toString());
                 convertView.setTag(viewHolderThirdType);

                break;
            }
        } else {
            switch (Type) {
            case 0:
                viewHolderfirstType = (ViewHolderfirstType) convertView.getTag();
                viewHolderfirstType.tv_first_theme.setText(listItem.map.get("Theme").toString());
                break;
            case 1:
                viewHoldersecondType = (ViewHoldersecondType) convertView.getTag();
                viewHoldersecondType.tv_second_content = (TextView) convertView.findViewById(R.id.tv_second_content);
                viewHoldersecondType.btn_second_theme = (Button) convertView.findViewById(R.id.btn_second_theme);
                viewHoldersecondType.tv_second_content.setText(listItem.map.get("Theme").toString());
                viewHoldersecondType.btn_second_theme.setText(listItem.map.get("Content").toString());
                break;
            case 2:
                viewHolderThirdType = (ViewHolderThirdType) convertView.getTag();
                viewHolderThirdType.tv_three_content = (TextView) convertView.findViewById(R.id.tv_three_content);
                viewHolderThirdType.et_three_theme = (EditText) convertView.findViewById(R.id.et_three_theme);
                viewHolderThirdType.tv_three_time = (TextView) convertView.findViewById(R.id.tv_three_time);
                viewHolderThirdType.et_three_theme.setText(listItem.map.get("Theme").toString());
                viewHolderThirdType.tv_three_content.setText(listItem.map.get("Content").toString());
                viewHolderThirdType.tv_three_time.setText(listItem.map.get("Date").toString());
                break;
            }

        }
        return convertView;
    }

    class ViewHolderfirstType {
        TextView tv_first_theme;
    }

    class ViewHoldersecondType {
        TextView tv_second_content;
        Button btn_second_theme;
    }

    class ViewHolderThirdType {
        EditText et_three_theme;
        TextView tv_three_content;
        TextView tv_three_time;
    }
}

我的genymotion又挂了......................................    布局看viewholder就知道了..不写了

时间: 2024-10-06 21:18:59

Listview实现不同类型的布局的相关文章

Android 解决ListView在使用多个布局的同时使用convertView进行缓存时导致ListView下面有空白的问题

在使用ListView时,在Adapter里面使用convertView会提高ListView的性能,提升100%?但今天发现在listView同时加载不同的View的同时会导致ListView最底下有一块空白,可能是恰巧吧,导致这样的原因可能是加载了几个不同的View,而他们的高度不同,数量也不同,系统无法准确计算ListView的总高度. 在 BaseAdapter里面提供了两个回调函数来指定有多少种布局,指定position对应的是哪一个布局. @Override public int g

ListView中不同类型view的实现

首先创建请求队列,一个活动中只需要一个,因此放在Application中: public class MyApplication extends Application{ private static RequestQueue requestQueue; @Override public void onCreate() { super.onCreate(); requestQueue = Volley.newRequestQueue(getApplicationContext()); } pub

ListView显示多种类型的item

ListView可以显示多种类型的条目布局,这里写显示两种布局的情况,其他类似 这是MainActivity:,MainActivity的布局就是一个ListView public class MainActivity extends Activity { private ListView lv; private List<People> lists; @Override protected void onCreate(Bundle savedInstanceState) { super.on

ListView之多种类型Item

一.概述 一般而言,listview每个item的样式是一样的,但也有很多应用场景下不同位置的item需要不同的样式. 拿微信举例,前者的代表作是消息列表,而后者的典型则是聊天会话界面. 本文重点介绍后者,也就是多类型item的listview的实现思路和方法,比如实现一个这样的聊天会话页面: 二.实现思路 2.1 第一种思路:用“一种类型”变相实现多种类型 这种思路其实与 ListView之点击展开菜单 这篇文章的原理一样,每个item的布局都包含所有类型的元素: 对于每个item,根据实际类

Listview 设置不同类型的item

要想设置不同的item需要在adapter里面重写两个方法 getItemViewType() 需要注意这个个类型是0开始 getViewTypeCount(); 1 package com.example.listview_01; 2 3 import java.util.List; 4 5 import android.content.Context; 6 import android.view.LayoutInflater; 7 import android.view.View; 8 im

Qt--对话框及其类型、布局管理器

原文地址:https://blog.51cto.com/13475106/2428225

ListView的不同item加载不同Layout

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

android listView的item 显示多种不同的布局

1.这篇博文不算什么知识点.使用的都是的系统中已经提供给我们的方式方法.这是最近用到了,感觉很实用,特此贡献出来. 首先需要定义,listview中需要展示的view个数,和view的布布局类型 private final int TYPE_1 = 0;    类型1 private final int TYPE_2 = 1;     类型2 private final int VIEW_TYPE = 2;  总布局数 @Override public int getItemViewType(i

Android05-UI02布局,自定义控件,ListView

1.布局 布局的内部除了放置控件外,也可以放置布局,通过多层布局的嵌套,我们就能够完成一些 比较复杂的界面实现 ¨四种基本布局 LinearLayout RelativeLayout FrameLayout TableLayout 2.补充知识 View 所有用户交互的组件(Widget)的基类 一个View对象占据矩形区域,并负责这个区域内的像素绘制和事件处理. ViewGroup 继承自View类 ViewGroup类是所有布局(layouts)的基类,布局类是不可见的,用于容纳其他View