listview如何包含不同类型的Item

来源:互联网 发布:农业科技网络书屋 官网 编辑:程序博客网 时间:2024/06/06 14:22


listview可以说是在我们安卓的日常开发中用到最多的控件,它主要用于一些列表的显示。ListView不与数据直接打交道,它需要适配器Adapter作为中间的桥梁。今天我要写的listview如何包含不同类型的Item,实际也是在Adapter里面做相应的处理。适配器我们常用的ArrayAdapter,SimpleAdapter和BaseAdapter,而前面两个实际是继承自BaseAdapter,只不过将一些过程给简化了。关于适配器的用法我就不进行讲解了,下面我们就来说一下,如何为ListView创建不同的Item。首先我们要清楚我们的目的为什么要给ListView创建不同的item,在实际应用中我们也会发现好多应用的一些显示列表存在一定规律但是具体item的布局却不相同,例如糗事百科的界面,qq的聊天界面等等。今天我就通过一个简单的例子来说明一下是如何实现的(一个简单的聊天界面)。

首先看一下要实现的效果:



实现不同的布局其实特别简单,我们在使用BaseAdapter的时候经常用到的四个方法是

getCount(),getItem(int position),getItemId(int position),getView(int position, View convertView, ViewGroup parent)
这几个方法的作用相信大家都特别清楚,但是实现不同布局的关键在下面几个方法:
getViewTypeCount()  返回你listview包含不同布局的数量
getItemViewType(int position) 返回相应position的布局类型(我们会根据不用的类型去inflate不同的布局)
下面我贴一下我写的Demo代码:例子比较简单我没有添加太多注释  如果有不懂得地方可以给我留言
activity:
package com.example.zhangs.listviewdemofordefitem;

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

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

public class MainActivity extends AppCompatActivity {
private ListView mListView;
private ChatAdapter mAdapter;
private List<ChatBean> mList;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
initData();
mAdapter = new ChatAdapter(this, mList);
mListView.setAdapter(mAdapter);
}

private void initViews() {
mListView = (ListView) findViewById(R.id.listView);
}

private void initData() {
mList = new ArrayList<>();
ChatBean chatBean1 = new ChatBean("时间1", "内容1", 0);
ChatBean chatBean2 = new ChatBean("时间2", "内容2", 1);
ChatBean chatBean3 = new ChatBean("时间3", "内容3", 1);
ChatBean chatBean4 = new ChatBean("时间4", "内容4", 0);
ChatBean chatBean5 = new ChatBean("时间5", "内容5", 1);
ChatBean chatBean6 = new ChatBean("时间6", "内容6", 1);
ChatBean chatBean7 = new ChatBean("时间7", "内容7", 0);
ChatBean chatBean8 = new ChatBean("时间8", "内容8", 0);
mList.add(chatBean1);
mList.add(chatBean2);
mList.add(chatBean3);
mList.add(chatBean4);
mList.add(chatBean5);
mList.add(chatBean6);
mList.add(chatBean7);
mList.add(chatBean8);

}
}

adapter:
package com.example.zhangs.listviewdemofordefitem;

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

import java.util.List;

/**
* Created by zhangs on 2016/3/22.
*/
public class ChatAdapter extends BaseAdapter {
private List<ChatBean> mList;
private Context mContext;
private static final int ITEM_TYPE_LEFT=0;
private static final int ITEM_TYEP_RIGHT=1;
private static final int ITEM_COUNT=2;
public ChatAdapter(Context context,List<ChatBean> list){
this.mList=list;
this.mContext=context;
}
@Override
public int getCount() {

return mList!=null?mList.size():0;
}

@Override
public Object getItem(int position) {

return mList.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder_Left viewHolder_left = null;
ViewHolder_Right viewHolderRight = null;
int item_type = getItemViewType(position);
//listview的复用
if (convertView == null) {

switch (item_type) {
case ITEM_TYPE_LEFT:
convertView= LayoutInflater.from(mContext).inflate(R.layout.chat_item_left,null);
viewHolder_left=new ViewHolder_Left();
viewHolder_left.tv_date_left= (TextView) convertView.findViewById(R.id.tv_chat_time_left);
viewHolder_left.tv_content_left= (TextView) convertView.findViewById(R.id.tv_chat_content_left);
convertView.setTag(viewHolder_left);
break;
case ITEM_TYEP_RIGHT:
convertView= LayoutInflater.from(mContext).inflate(R.layout.chat_item_right,null);
viewHolderRight=new ViewHolder_Right();
viewHolderRight.tv_date_right= (TextView) convertView.findViewById(R.id.tv_chat_time_right);
viewHolderRight.tv_content_right= (TextView) convertView.findViewById(R.id.tv_chat_content_right);
convertView.setTag(viewHolderRight);
break;
}
}else {
switch (item_type) {
case ITEM_TYPE_LEFT:
viewHolder_left= (ViewHolder_Left) convertView.getTag();
break;
case ITEM_TYEP_RIGHT:
viewHolderRight= (ViewHolder_Right) convertView.getTag();
break;
}

}
//给布局设置内容
switch (item_type){
case ITEM_TYPE_LEFT:
viewHolder_left.tv_date_left.setText(mList.get(position).getDate());
viewHolder_left.tv_content_left.setText(mList.get(position).getContent());
break;
case ITEM_TYEP_RIGHT:
viewHolderRight.tv_date_right.setText(mList.get(position).getDate());
viewHolderRight.tv_content_right.setText(mList.get(position).getContent());
break;
}

return convertView;
}

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

@Override
public int getItemViewType(int position) {

return mList.get(position).getType()==0?ITEM_TYPE_LEFT:ITEM_TYEP_RIGHT;
}
class ViewHolder_Left{
TextView tv_date_left;
TextView tv_content_left;
}
class ViewHolder_Right{
TextView tv_date_right;
TextView tv_content_right;
}
}
bean:模拟的数据   可以根据自己的数据和逻辑来标识item的类型


package com.example.zhangs.listviewdemofordefitem;

/**
* Created by zhangs on 2016/3/22.
*/
public class ChatBean {
private String date;
private String content;
private int type;

public ChatBean(String date, String content, int type) {
this.date = date;
this.content = content;
this.type = type;
}

public String getDate() {
return date;
}

public void setDate(String date) {
this.date = date;
}

public String getContent() {
return content;
}

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

public int getType() {
return type;
}

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


布局文件:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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.zhangs.listviewdemofordefitem.MainActivity">
<!--android:listSelector="@android:color/transparent" 去掉listview的点击效果-->
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:listSelector="@android:color/transparent"
>
</ListView>
</RelativeLayout>

chat_item_left.xml

<?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="match_parent"
android:orientation="vertical">

<TextView
android:id="@+id/tv_chat_time_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="shijian"
android:textSize="13dp"
android:layout_marginLeft="35dp"
android:layout_marginTop="13dp"
android:textColor="#aaaaaa" />

<TextView
android:id="@+id/tv_chat_content_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/liaotian_them_new"
android:paddingLeft="15dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingRight="10dp"
android:gravity="center_vertical"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="10dp"
android:layout_marginLeft="25dp"
android:textColor="#333333"
android:textSize="17dp"
android:text="haha"

/>

</LinearLayout>
chat_item_right.xml
<?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="match_parent"
android:gravity="right"
android:orientation="vertical">
<TextView
android:id="@+id/tv_chat_time_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="35dp"
android:layout_marginTop="13dp"
android:text="shijian"
android:textColor="#aaaaaa"
/>
<TextView
android:id="@+id/tv_chat_content_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingRight="15dp"
android:textSize="17dp"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
android:layout_marginBottom="10dp"
android:layout_marginRight="25dp"
android:textColor="#333333"
android:gravity="center_vertical"
android:background="@drawable/liaotian_me_new"
/>

</LinearLayout>

ok 所有代码都在上面,最后说一个需要注意的地方:
 假如getViewTypeCount()返回4(代表有四种不同的布局)  那么布局相应的类型只能是0,1,2,3.


2 0
原创粉丝点击