Android ListView实现不同类型的item

Android ListView 多类型Item实践
本文介绍如何在Android应用中实现ListView的不同类型的Item布局。包括两种Item布局的设计与实现,实体类创建以及适配器的编写过程。

小编也是初来乍到,对于Android也是摸着石头过河。今天算是摸索着把listView不同类型的item给实现了,网上找了那么多每一个是完整版的,伤透脑筋,废话不多,上代码(有过错还请指正):
先看主布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.message.MainActivity">

    <ListView
        android:id="@+id/message_lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
       />
</LinearLayout>

两种Item两种布局:
第一种:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="horizontal"
              android:padding="10dp">

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2">

        <ImageView
            android:id="@+id/message_item2_img"
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:src="@mipmap/messagescenter_at"/>
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="8">

        <TextView
            android:id="@+id/message_item2_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:text="评论"
            android:textSize="18sp"/>
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">

        <ImageView
            android:id="@+id/message_item2_back"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_gravity="center_vertical"
            android:src="@mipmap/alipay_msp_arrow"
            />
    </RelativeLayout>
</LinearLayout>

第二种(下面的那种布局)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="horizontal"
              android:padding="10dp">

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2">

        <ImageView
            android:id="@+id/message_item1_img"
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:src="@mipmap/messagescenter_at"/>
    </RelativeLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="7"
        android:orientation="vertical">
        <TextView
            android:id="@+id/message_item1_text1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="小凡"
            android:textSize="18sp"/>
        <TextView
            android:id="@+id/message_item1_text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="小凡你好小凡你好小凡你好小凡你好小凡你好小凡你好"
            android:singleLine="true"
            android:textSize="14sp"/>
    </LinearLayout>
    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2">
        <TextView
            android:id="@+id/message_item1_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="2016-12"/>
    </RelativeLayout>

</LinearLayout>

建实体类(两种都建):

package com.example.message;

import android.provider.ContactsContract;

import java.io.Serializable;

/**
 * @author BULUSILI
 * @描述    消息ListView类型2bean类
 * @项目名称
 * @包名 com.example.message
 * @2016/8/4--13:33
 */
public class MessageB implements Serializable{
    int messageIndex;
    String name;
    String content;
    String time;

    public MessageB(int messageIndex, String name, String content, String time) {
        this.messageIndex = messageIndex;
        this.name = name;
        this.content = content;
        this.time = time;
    }

    public int getMessageIndex() {
        return messageIndex;
    }

    public void setMessageIndex(int messageIndex) {
        this.messageIndex = messageIndex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}
package com.example.message;

import java.io.Serializable;

/**
 * @author BULUSILI
 * @描述    消息ListView类型1bean类
 * @项目名称
 * @包名 com.example.message
 * @2016/8/4--13:30
 */
public class MessageA implements Serializable{
    int messageIndex;
    String text;
    int next;

    public MessageA(int messageIndex, String text, int next) {
        this.messageIndex = messageIndex;
        this.text = text;
        this.next = next;
    }

    public int getMessageIndex() {
        return messageIndex;
    }

    public void setMessageIndex(int messageIndex) {
        this.messageIndex = messageIndex;
    }

    public int getNext() {
        return next;
    }

    public void setNext(int next) {
        this.next = next;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

适配器:

package com.example.message;

import android.content.Context;
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 java.util.List;

/**
 * @author BULUSILI
 * @描述    仿新浪消息不同listView不同item布局适配器
 * @项目名称
 * @包名 com.example.message
 * @2016/8/4--14:04
 */
public class MyMessAdapter extends BaseAdapter{
    public static final int TYPE_TITLE = 0; //两种类型
    public static final int TYPE_COMPANY = 1;
    Context mContext;
    List<MessageA>mList1;
    List<MessageB>mList2;

    public MyMessAdapter(Context context, List<MessageA> list1, List<MessageB> list2) {
        mContext = context;
        mList1 = list1;
        mList2 = list2;
    }

    @Override
    public int getCount() {
        return (mList1.size()+mList2.size());

    }
    //这个不用管
    @Override
    public Object getItem(int i) {
        return null;
    }
    //这个不用管
    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public int getItemViewType(int position) {
        if (position<=2){
            return TYPE_TITLE;
        }else {
            return TYPE_COMPANY;
        }

    }

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

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        //声明一下viewHolder
        MessageAviewHolder holderA;
        MessageBviewHolder holderB;
        switch (getItemViewType(i)){
            case TYPE_TITLE:
                if (view==null){
                    view= LayoutInflater.from(mContext).inflate(R.layout.item2,null);
                    holderA=new MessageAviewHolder();
                    holderA.messageIndex= (ImageView) view.findViewById(R.id.message_item2_img);
                    holderA.text= (TextView) view.findViewById(R.id.message_item2_text);
                    holderA.next= (ImageView) view.findViewById(R.id.message_item2_back);
                    view.setTag(holderA);
                }else{
                    holderA= (MessageAviewHolder) view.getTag();
                }
                //赋值  通过这一步说明还是要建实体类的
                holderA.messageIndex.setImageResource(mList1.get(i).getMessageIndex());
                holderA.text.setText(mList1.get(i).getText());
                holderA.next.setImageResource(mList1.get(i).getNext());
                break;
            case TYPE_COMPANY:
                if (view==null){
                    view= LayoutInflater.from(mContext).inflate(R.layout.item1,null);
                    holderB=new MessageBviewHolder();
                    holderB.messageIndex= (ImageView) view.findViewById(R.id.message_item1_img);
                    holderB.name= (TextView) view.findViewById(R.id.message_item1_text1);
                    holderB.content= (TextView) view.findViewById(R.id.message_item1_text2);
                    holderB.time= (TextView) view.findViewById(R.id.message_item1_time);
                    view.setTag(holderB);
                }else{
                    holderB= (MessageBviewHolder) view.getTag();
                }
                //赋值  通过这一步说明还是要建实体类的
                //一定要减去上一个类型的数量,不然越界
                holderB.messageIndex.setImageResource(mList2.get(i-3).getMessageIndex());
                holderB.name.setText(mList2.get(i-3).getName());
                holderB.content.setText(mList2.get(i-3).getContent());
                holderB.time.setText(mList2.get(i-3).getTime());
                break;
        }
        return view;
    }
    class MessageAviewHolder{
        ImageView messageIndex;
        TextView text;
        ImageView next;
    }
    class MessageBviewHolder{
        ImageView messageIndex;
        TextView name;
        TextView content;
        TextView time;
    }
}

最后就是Activity了:

package com.example.message;

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

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

public class MainActivity extends AppCompatActivity {
    ListView mListView;
    MyMessAdapter mAdapter;
   // List<String> mList;
    List<MessageA> mList1; //固定集合
    List<MessageB>mList2;  //聊天的集合
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        initAdapter();
    }

    private void initView() {
        mListView= (ListView) findViewById(R.id.message_lv);
    }

    private void initData() {
      /*  mList=new ArrayList<>();
        for (int i = 0; i <20 ; i++) {
            mList.add(Integer.toString(i));
        }*/
        mList1=new ArrayList<>();
        mList2=new ArrayList<>();
        MessageA messageA1=new MessageA(R.mipmap.messagescenter_at,"@我的",R.mipmap.alipay_msp_arrow);
        MessageA messageA2=new MessageA(R.mipmap.messagescenter_comments,"评论",R.mipmap.alipay_msp_arrow);
        MessageA messageA3=new MessageA(R.mipmap.messagescenter_good,"赞",R.mipmap.alipay_msp_arrow);
        mList1.add(messageA1);
        mList1.add(messageA2);
        mList1.add(messageA3);

        for (int i = 0; i <10 ; i++) {
            MessageB messageB=new MessageB(R.mipmap.apic20600,"小凡","你好","09:38");
            mList2.add(messageB);
        }
    }

    private void initAdapter() {
        //mAdapter=new MyMessAdapter(this);
        mAdapter=new MyMessAdapter(this,mList1,mList2);
        mListView.setAdapter(mAdapter);
    }
}

效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值