Android中ListView多种Item布局的实现
来源:互联网 发布:淘宝助理官方网站下载 编辑:程序博客网 时间:2024/05/16 19:52
我们在对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;}@Overridepublic int getCount() {return data.size();}@Overridepublic Messages getItem(int position) {return getData().get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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;@Overridepublic int getItemViewType(int position) {return data.get(position).isMe()?MESSAGE_TYPE_ME:MESSAGE_TYPE_NOTME;}@Overridepublic 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;@Overrideprotected 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
1 0
- Android中ListView多种Item布局的实现
- Android利用ListView实现多种Item的复杂布局
- Android中ListView多种Item布局
- android中如何让listview的item是多种布局
- Android Listview item多种子布局实现方法详解
- ListView实现多种item布局的方法和注意事项
- ListView实现多种item布局的方法和注意事项
- android listView的item 显示多种不同的布局
- Android listview 包含你多种item布局的情况
- Android ListView不同的item布局实现
- Android ListView 实现多种布局
- Android—自定义Adapter实现多种Item视图的ListView
- ListView Item多种布局优化
- ListView具有多种item布局
- ListView Item多种布局优化
- ListView Item多种布局优化
- 【Android】ListView具有多种item布局——实现微信对话列
- android 实现listview的adapter多种布局方式
- LINUX内核中的xx_initcall初始化标号
- 《锋利的JQuery》读书笔记(二)
- 一个枚举的简单例子
- openstack:nova中“从镜像启动”创建虚拟机的流程
- iOS获取设置的推送是否打开的方法
- Android中ListView多种Item布局的实现
- MySQL的lock tables和unlock tables的用法(转载)
- 包的知识点
- Winform应用程序实现加载等待(C#)
- hdoj 2188 悼念512汶川大地震遇难同胞——选拔志愿者【巴什博弈】
- 播放gif控件 GifMovieView.java
- 详解Android动画之Tween Animation
- 设计模式之:备忘录模式(Memento)
- 《锋利的JQuery》读书笔记(三)