小编也是初来乍到,对于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);
}
}
Android ListView 多类型Item实践
本文介绍如何在Android应用中实现ListView的不同类型的Item布局。包括两种Item布局的设计与实现,实体类创建以及适配器的编写过程。
3731

被折叠的 条评论
为什么被折叠?



