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

Android之ListView打造聊天界面

2016-03-03 14:40 651 查看
在上篇博客我们讲了关于RecyclerView的多布局,我之前说了ListView与RecyclerView多布局还是有区别的,下面我们来看看区别在哪个地方!

首先在adapter里面,由于我们使用adapter都是继承BaseAdapter,每次都要重新实现 getCount()、getItem()等方法,你会发现这些方法每次写的都一样,唯一有区别就是getView方法,每次都要写这么多代码,累吧!

累!!!


于是我对adapter进行简单封装,来看一下代码:

public abstract class MyBaseAdapter<T, Q> extends BaseAdapter {
private List<T> mList;
private Context mContext;
private Q view;
public MyBaseAdapter() {
super();
}

public MyBaseAdapter(List<T> mList, Context mContext) {
super();
this.mList = mList;
this.mContext = mContext;
}

public MyBaseAdapter(List<T> mList, Context mContext, Q view) {
super();
this.mList = mList;
this.mContext = mContext;
this.view = view;
}

@Override
public int getCount() {
return mList == null ? 0 : mList.size();
}

@Override
public Object getItem(int position) {
return mList.get(position);
}

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

}


这样我们只需继承这个基类就可以了,就不要再写那些方法了,只需要实现getView方法就可以了。

关于ListView的多布局,我们需要重写两个方法:

@Override
public int getItemViewType(int position) {
//因为在ChatEntity里面添加了类型,判断position上对应的类型
ChatEntity data = mChatData.get(position);
return data.getmType();
}

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


getItemViewType()这个方法是获取该位置的类型,getViewTypeCount()是指返回类型的数量,目前我们是做对话界面,类型在实体类里面添加了,至于这个2,是因为我们有两个布局。我们在getView根据类型判断即可,这里不贴代码了,下面demo里面有。

效果图:



(二)我们都知道QQ消息左滑能删除该消息的,怎么实现的呢?

有一个叫swipmenu的library这里面有大牛封装好的左滑效果,我们只要添加以下代码就可以实现左滑效果:

布局中:

<com.hy.swipemenulistview.SwipeMenuListView
android:layout_gravity="center"
android:id="@+id/chat_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:scrollbars="none"/>


代码中:

/***
* 初始化滑动菜单
* */

private void initMenu() {
SwipeMenuCreator creator = new SwipeMenuCreator() {
@Override
public void create(SwipeMenu menu) {
//创建打开菜单Item
SwipeMenuItem openItem = new SwipeMenuItem(ChatActivity.this);
// set item background设置背景
openItem.setBackground(new ColorDrawable(Color.rgb(0xC9, 0xC9,0xCE)));
// set item width设置宽
openItem.setWidth(dp2px(90));
// set item title设置标题
openItem.setTitle("Open");
// set item title fontsize这是标题大小
openItem.setTitleSize(18);
// set item title font color设置标题颜色
openItem.setTitleColor(Color.WHITE);
// add to menu添加到菜单中
menu.addMenuItem(openItem);
// create "delete" item
SwipeMenuItem deleteItem = new SwipeMenuItem(getApplicationContext());
// set item background
deleteItem.setBackground(new ColorDrawable(Color.rgb(0xF9,0x3F, 0x25)));
// set item width
deleteItem.setWidth(dp2px(90));
// set a icon
deleteItem.setIcon(R.mipmap.ic_delete);
// add to menu
menu.addMenuItem(deleteItem);

}
};
mListView.setMenuCreator(creator);
}


这样就把那个左滑菜单添加到item里面了,如果我们想要对item操作,还要给ListView添加onMenuItemClick监听。

@Override
public void onMenuItemClick(int position, SwipeMenu menu, int index) {
switch (index) {
case 0:
Toast.makeText(ChatActivity.this, "你点到人家啦!", Toast.LENGTH_SHORT).show();
break;
case 1:
mChatData.remove(position);
mTextAdapter.notifyDataSetChanged();
break;
}
}


这样就实现左滑,并带有操作的效果。

效果图:



如果在添加library出现下面问题:



这是说里面的v4包版本不同,只要把其中一个复制替换另一个即可。不替换可能会出现其他隐藏问题(目前还不确定病情)。

如有疑问~请与我联系~~

demo下载地址

ListView聊天

swipmenu左滑library
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: