Android学习笔记二十五之ListView多布局实现

Android学习笔记二十五之ListView多布局实现

  这一节是介绍ListView这个控件的最后一节,实现一个Item的多布局。像我们经常在用的各种即时通讯工具,QQ、微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,这一节,我们就来实现一个ListView的多种Item。

  要实现ListView里面有多种Item,就要重写适配器的两个方法getViewTypeCount()和getItemViewType(int position),第一个方法是返回Item的种类数目,第二个是返回当前Item是哪种类型。下面我们具体实现来说明:

自定义适配器代码:

package com.example.listviewdemo.adapter;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.listviewdemo.Chat;
import com.example.listviewdemo.R;

import java.util.List;

/**
 * Created by Devin on 2016/7/11.
 * 实现多种Item布局
 * 重写两个方法getViewTypeCount()和getItemViewType(int position)
 */
public class ChatAdapter extends BaseAdapter {

private static String TAG = "ChatAdapter";
/**
 * 右边显示的布局
 */
public static final int ITEM_RIGHT = 0;
/**
 * 中间显示时间
 */
public static final int ITEM_TIME = 1;
/**
 * 左边显示的布局
 */
public static final int ITEM_LEFT = 2;
private static int ITEM_TOTAL_COUNT = 3;
private Context mContext;
private List<Chat> chatList;

public ChatAdapter(Context mContext, List<Chat> chatList) {
    this.mContext = mContext;
    this.chatList = chatList;
}

@Override
public int getCount() {
    Log.i(TAG, chatList.size() + "");
    return chatList.size();
}

@Override
public Object getItem(int i) {
    return chatList.get(i);
}

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

/**
 * 返回多少种Item布局
 *
 * @return
 */
@Override
public int getViewTypeCount() {
    return ITEM_TOTAL_COUNT;
}

/**
 * 根据position返回相应的Item
 *
 * @param position
 * @return
 */
@Override
public int getItemViewType(int position) {
    Log.i(TAG, chatList.get(position).getType() + "");
    return chatList.get(position).getType();
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    int type = getItemViewType(i);
    Chat chat = chatList.get(i);
    ViewHolderLeft viewHolderLeft = null;
    ViewHolderRight viewHolderRight = null;
    ViewHolderTime viewHolderTime = null;
    if (view == null) {
        switch (type) {
            case ITEM_LEFT:
                view = LayoutInflater.from(mContext).inflate(R.layout.item_left, null);
                viewHolderLeft = new ViewHolderLeft();
                viewHolderLeft.ivLeftImage = (ImageView) view.findViewById(R.id.iv_left_image);
                viewHolderLeft.tvLeftText = (TextView) view.findViewById(R.id.tv_left_text);
                viewHolderLeft.ivLeftImage.setImageResource(R.drawable.icon);
                viewHolderLeft.tvLeftText.setText(chat.getValue());
                view.setTag(viewHolderLeft);
                break;
            case ITEM_TIME:
                view = LayoutInflater.from(mContext).inflate(R.layout.item_center, null);
                viewHolderTime = new ViewHolderTime();
                viewHolderTime.tvTime = (TextView) view.findViewById(R.id.tv_time);
                viewHolderTime.tvTime.setText(chat.getValue());
                view.setTag(viewHolderTime);
                break;
            case ITEM_RIGHT:
                view = LayoutInflater.from(mContext).inflate(R.layout.item_right, null);
                viewHolderRight = new ViewHolderRight();
                viewHolderRight.ivRightImage = (ImageView) view.findViewById(R.id.iv_right_image);
                viewHolderRight.tvRightText = (TextView) view.findViewById(R.id.tv_right_text);
                viewHolderRight.ivRightImage.setImageResource(R.drawable.touxiang);
                viewHolderRight.tvRightText.setText(chat.getValue());
                view.setTag(viewHolderRight);
                break;
        }

    } else {
        switch (type) {

            case ITEM_LEFT:
                viewHolderLeft = (ViewHolderLeft) view.getTag();
                viewHolderLeft.ivLeftImage.setImageResource(R.drawable.icon);
                viewHolderLeft.tvLeftText.setText(chat.getValue());
                break;
            case ITEM_TIME:
                viewHolderTime = (ViewHolderTime) view.getTag();
                viewHolderTime.tvTime.setText(chat.getValue());
                break;
            case ITEM_RIGHT:
                viewHolderRight = (ViewHolderRight) view.getTag();
                viewHolderRight.ivRightImage.setImageResource(R.drawable.touxiang);
                viewHolderRight.tvRightText.setText(chat.getValue());
                break;
        }

    }

    return view;
}

private static class ViewHolderLeft {
    //左边显示头像
    ImageView ivLeftImage;
    //左边显示的文本
    TextView tvLeftText;
}

private static class ViewHolderTime {
    //中间显示时间
    TextView tvTime;
}

private static class ViewHolderRight {
    //右边显示的头像
    ImageView ivRightImage;
    //右边显示的文本
    TextView tvRightText;
}
}

这里简单定义了三种类型的Item,左边显示一个聊天,中间显示时间,右边显示另外一个聊天。

中间Item布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
    android:id="@+id/tv_time"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:padding="4dp"
    android:text="shijian"
    android:textColor="#000000"
    android:textSize="12sp" />

</RelativeLayout>

左边Item布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_marginRight="10dp"
    android:layout_marginTop="10dp"
    android:padding="8dp">

    <ImageView
        android:id="@+id/iv_left_image"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginRight="5dp"
        android:src="@drawable/touxiang" />

    <TextView
        android:id="@+id/tv_left_text"
        android:textColor="#000000"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@id/iv_left_image"
        android:text="这是文本"
        android:textSize="14sp" />

</RelativeLayout>

</RelativeLayout>

右边Item布局代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_marginRight="10dp"
    android:layout_marginTop="10dp"
    android:padding="8dp">

    <TextView
        android:id="@+id/tv_right_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginRight="5dp"
        android:text="这是文本"
        android:textColor="#000000"
        android:textSize="14sp" />

    <ImageView
        android:id="@+id/iv_right_image"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_toRightOf="@id/tv_right_text"
        android:src="@drawable/icon" />

</RelativeLayout>

</RelativeLayout>

中间显示时间,左右两边都是简单的显示一个头像和一个文本。

Activity代码:

package com.example.listviewdemo.activity;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;

import com.example.listviewdemo.Chat;
import com.example.listviewdemo.R;
import com.example.listviewdemo.adapter.ChatAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Devin on 2016/7/11.
 */
public class MoreItemActivity extends AppCompatActivity {
private ListView lv_chart;
private ChatAdapter adapter;
private List<Chat> chatList;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_moreitem);
    lv_chart = (ListView) findViewById(R.id.lv_chart);
    chatList = new ArrayList<>();
    initData();
    adapter = new ChatAdapter(getApplicationContext(), chatList);
    lv_chart.setAdapter(adapter);
}

/**
 * 初始化数据
 */
private void initData() {
    Chat chat1 = new Chat();
    chat1.setType(ChatAdapter.ITEM_TIME);
    chat1.setValue("2016-7-11 下午 16:39");
    chatList.add(chat1);

    Chat chat2 = new Chat();
    chat2.setType(ChatAdapter.ITEM_LEFT);
    chat2.setValue("这是左边第一条测试数据");
    chatList.add(chat2);

    Chat chat3 = new Chat();
    chat3.setType(ChatAdapter.ITEM_RIGHT);
    chat3.setValue("这是右边第一条测试数据");
    chatList.add(chat3);

    Chat chat4 = new Chat();
    chat4.setType(ChatAdapter.ITEM_TIME);
    chat4.setValue("2016-7-11 下午 16:40");
    chatList.add(chat4);

    Chat chat5 = new Chat();
    chat5.setType(ChatAdapter.ITEM_LEFT);
    chat5.setValue("这是左边第二条测试数据");
    chatList.add(chat5);

    Chat chat6 = new Chat();
    chat6.setType(ChatAdapter.ITEM_RIGHT);
    chat6.setValue("这是右边第二条测试数据");
    chatList.add(chat6);

    Chat chat7 = new Chat();
    chat7.setType(ChatAdapter.ITEM_TIME);
    chat7.setValue("2016-7-11 下午 16:41");
    chatList.add(chat7);

    Chat chat8 = new Chat();
    chat8.setType(ChatAdapter.ITEM_LEFT);
    chat8.setValue("这是左边第三条测试数据");
    chatList.add(chat8);

    Chat chat9 = new Chat();
    chat9.setType(ChatAdapter.ITEM_RIGHT);
    chat9.setValue("这是右边第三条测试数据");
    chatList.add(chat9);

    Chat chat10 = new Chat();
    chat10.setType(ChatAdapter.ITEM_LEFT);
    chat10.setValue("这是左边第四条测试数据");
    chatList.add(chat10);

    Chat chat11 = new Chat();
    chat11.setType(ChatAdapter.ITEM_RIGHT);
    chat11.setValue("这是右边第四条测试数据");
    chatList.add(chat11);

    Chat chat12 = new Chat();
    chat12.setType(ChatAdapter.ITEM_LEFT);
    chat12.setValue("这是左边第五条测试数据");
    chatList.add(chat12);

    Chat chat13 = new Chat();
    chat13.setType(ChatAdapter.ITEM_RIGHT);
    chat13.setValue("这是右边第五条测试数据");
    chatList.add(chat13);

    Chat chat14 = new Chat();
    chat14.setType(ChatAdapter.ITEM_RIGHT);
    chat14.setValue("这是右边第六条测试数据");
    chatList.add(chat14);

}
}

还有就是一个普通的javabean

package com.example.listviewdemo;

/**
 * Created by Devin on 2016/7/11.
 */
public class Chat {
private int type;
private String value;

public Chat() {
}

public Chat(int type, String value) {
    this.type = type;
    this.value = value;
}

public int getType() {
    return type;
}

public void setType(int type) {
    this.type = type;
}

public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}
}

最后实现效果图:

ListView多布局实现主要是重写两个方法,判断当前是哪一种Item,最后加载不同的内容。ListView的学习就告一段落了,下面我们介绍一下GridView网格视图。

时间: 2024-07-31 14:33:09

Android学习笔记二十五之ListView多布局实现的相关文章

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

Android学习笔记二十五.Service组件入门(三)使用IntentService

使用IntentService 1.Service缺陷 由于Service本身存在以下两个问题: (1)Service不会专门启动一条单独的进程,Service与他所在应用位于同一进程中: (2)Service也不是专门一条新的线程,如果我们在Service中直接处理耗时的任务,那么就会导致应用程序出现假性"卡死".如果我们需要在Service处理耗时任务,也可以在Service的onCreate()方法中启动一条新线程来处理该耗时任务(如上例).但是,问题来了,启动Service的A

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司.Notification通知.PopupWindow弹出窗 Toast吐司 Toast吐司是我们经常用到的一个控件,Toast是AndroidOS用来显示消息的一种机制,它与Dialog不同,Toast不会获取到焦点,通常显示一段时间之后就会自动消失,下面我们来介绍Toast的几种常用方式: 第一种,默认显示方式,也是最常用的方式: Toast.makeText(MainActivity.this, "这是默认的显示方式", Toast.LE

Android学习笔记(十五)——碎片的生命周期(附源码)

碎片的生命周期 点击下载源码 与活动类似,碎片具有自己的生命周期.理解了碎片的生命周期后,我们可以在碎片被销毁时正确地保存其实例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Fragments,在Fragment1.java文件中添加如下代码: package net.zenail.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragm

马哥学习笔记二十五——ISCSI协议,架构及其安装配置

ISCSI监听在tcp/3260端口 iSCSI Target:iscsi-target-utils 客户端认正方式: 1.基于IP 2.基于用户,CHAP tgtadm:命令行工具,模式化命令 --mode 常用模式:target,logicalunit,account target --op new.delete.show.update.bind.unbind logicalunit --op new.delete account --op new.delete.bind.unbind --

angular学习笔记(二十五)-$http(3)-转换请求和响应格式

本篇主要讲解$http(config)的config中的tranformRequest项和transformResponse项 1. transformRequest: $http({ transformRequest: function(data){ //对前台发送的data进行处理 return data } }) 这个在测试的时候遇到了很大的问题.只要经过transformRequest函数处理,哪怕是不做任何处理,node后台都会报错,需要尝试使用php 2. transformResp

Android学习笔记二十.使用ContentProvider实现数据共享(二).URI...工具类

一.UriMatcher与ContentUris工具类 UriMatcher 1.功能概述 开发ContentProvider时所实现的query().insert().delete().update()方法的第一个参数为Uri参数,该参数由ContentResolver调用这些方法时传入.在上一篇博文中的实例,并没有真正对数据进行操作,因此ContentProvider并未对Uri参数进行任何判断.所以为了确定该ContentProvider实际能处理的Uri,以确定每个方法中Uri参数所操作

Android学习笔记二十二.使用ContentProvider实现数据共享(五).监听ContentProvider的数据改变

一.使用ContentProvider管理多媒体内容 Android提供了Camera程序来支持拍照.拍摄视频,用户拍摄的相片.视频都将存放在固定的位置.Android同样为这些多媒体内容提供了ContentProvider,所以我们可以通过使用ContentProvider实现其他应用直接访问Camera所拍摄的照片.视频等. 1.多媒体ContentProvider的Uri (1)MediaStore.Audio.Media.EXTERNAL_CONTENT_URI:存储在外部存储器(SD卡