您的位置:首页 > 移动开发 > Android开发

Android中ListView多种Item布局的实现

2016-01-27 11:23 423 查看
    我们在对ListView设置item的布局的时候,通常只会考虑到一种item。但是多种item布局的情况还是很常见的,比如说聊天界面,需要用两种item布局来分别表示发送和接收的消息。

    刚开始我的想法是通过对发送消息的实体类中添加一个布尔型变量来区分消息是发送的还是接收的:

package cn.qt.demo;

public class Messages {
private boolean isMe;
}

在BaseAdapter的getView()方法中通过判断当前显示item的消息的isMe属性来给convertView设置不同的layout,但是由于convertView的复用和优化,会导致显示错乱,达不到预期的结果。通过我的进一步查询资料,我发现BaseAdapter自带两个方法可以实现这种需求:

getItemViewType() 获得item的布局类型

getViewTypeCount() 获得item的布局的个数

废话不多说,上代码

MessageAdapter.java

package cn.qt.demo;

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

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

public class MessageAdapter extends BaseAdapter{
private Context context;
private List<Messages> data;
private LayoutInflater inflater;

public MessageAdapter(Context context, List<Messages> data) {
super();
this.context = context;
setData(data);
inflater = LayoutInflater.from(this.context);
}

public List<Messages> getData() {
return data;
}

public void setData(List<Messages> data) {
if(data == null) {
data = new ArrayList<Messages>();
}
this.data = data;
}

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

@Override
public Messages getItem(int position) {
return getData().get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
Messages message = getItem(position);
if(convertView == null) {
holder = new ViewHolder();
if(getItemViewType(position)==MESSAGE_TYPE_ME) {
convertView=inflater.inflate(R.layout.item_isme, null);
} else {
convertView = inflater.inflate(R.layout.item_notme, null);
}
holder.tvText = (TextView) convertView.findViewById(R.id.tv_message);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvText.setText(message.getText());
return convertView;
}

class ViewHolder {
TextView tvText;
}

public static final int MESSAGE_TYPE_ME = 0;
public static final int MESSAGE_TYPE_NOTME = 1;
@Override
public int getItemViewType(int position) {
return data.get(position).isMe()?MESSAGE_TYPE_ME:MESSAGE_TYPE_NOTME;
}

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

package cn.qt.demo;

public class Messages {
private String text;
private boolean isMe;
public Messages() {
super();
}
public Messages(String text, boolean isMe) {
super();
this.text = text;
this.isMe = isMe;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public boolean isMe() {
return isMe;
}
public void setMe(boolean isMe) {
this.isMe = isMe;
}

}
MainActivity.java

package cn.qt.demo;

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

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

public class MainActivity extends Activity {
private ListView lvMessage;
private MessageAdapter adapter;
private List<Messages> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

lvMessage =(ListView) findViewById(R.id.lv_message);
data = new ArrayList<Messages>();
adapter = new MessageAdapter(this, data);
lvMessage.setAdapter(adapter);
}

public void doClick(View v) {
switch (v.getId()) {
case R.id.btn_notme:
data.add(new Messages("这是接收的消息", false));
adapter.notifyDataSetChanged();
lvMessage.setSelection(lvMessage.getBottom());
break;

case R.id.btn_isme:
data.add(new Messages("这是发送的消息", true));
adapter.notifyDataSetChanged();
lvMessage.setSelection(lvMessage.getBottom());
break;
}
}

}


此Demo的资源链接:http://download.csdn.net/detail/qt1105338951/9419788
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息