Android中ListView多种Item布局的实现
2016-01-27 11:23
423 查看
我们在对ListView设置item的布局的时候,通常只会考虑到一种item。但是多种item布局的情况还是很常见的,比如说聊天界面,需要用两种item布局来分别表示发送和接收的消息。
刚开始我的想法是通过对发送消息的实体类中添加一个布尔型变量来区分消息是发送的还是接收的:
在BaseAdapter的getView()方法中通过判断当前显示item的消息的isMe属性来给convertView设置不同的layout,但是由于convertView的复用和优化,会导致显示错乱,达不到预期的结果。通过我的进一步查询资料,我发现BaseAdapter自带两个方法可以实现这种需求:
getItemViewType() 获得item的布局类型
getViewTypeCount() 获得item的布局的个数
废话不多说,上代码
MessageAdapter.java
此Demo的资源链接:http://download.csdn.net/detail/qt1105338951/9419788
刚开始我的想法是通过对发送消息的实体类中添加一个布尔型变量来区分消息是发送的还是接收的:
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
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories