在上一篇博客《Android 高仿微信(QQ)滑动弹出编辑、删除菜单效果,增加下拉刷新功能》里,已经带着大家学习如何使用SwipeMenuListView这一开源库实现滑动列表弹出菜单,接下来,将进一步学习,如何为不同的list
item呈现不同的菜单,此处我们做一个实例:Android 高仿QQ滑动弹出菜单标记已读、未读消息,看下效果图:

1. 创建项目,并导入SwipeMenuListView类库

2. 创建消息实体bean:

public class Msg {

    public int id;

    public String title;

    public String desc;

    // false是未读;true是已读
public boolean isRead; @Override
public String toString() {
return "Msg{" +
"id=" + id +
", title='" + title + '\'' +
", desc='" + desc + '\'' +
", isRead=" + isRead +
'}';
}
}

注: 通过isRead字段,我们区分菜单显示“设为已读”“设为未读”;

3. 创建列表显示的Adapter,重写其中的getItemViewType方法:

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; import java.util.List; /**
* my msgs list adapter
*/
public class MyMsgAdapter extends BaseAdapter { private Activity mContext; private LayoutInflater mInflater; private List<Msg> mDatas; public MyMsgAdapter(Activity context, List<Msg> datas) {
mContext = context;
mInflater = LayoutInflater.from(mContext);
mDatas = datas;
} @Override
public int getCount() {
return (mDatas != null ? mDatas.size() : 0);
} @Override
public Object getItem(int position) {
return (mDatas != null ? mDatas.get(position) : null);
} @Override
public long getItemId(int position) {
return position;
} @Override
public int getViewTypeCount() {
return 2;
} @Override
public int getItemViewType(int position) {
Msg myMsg = mDatas.get(position);
boolean isRead = myMsg.isRead;
if (isRead) {
return 0;
} else {
return 1;
}
} @Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
// 下拉项布局
convertView = mInflater.inflate(R.layout.list_item_my_msg, null); holder = new ViewHolder(); holder.img_msg = (ImageView) convertView.findViewById(R.id.img_msg);
holder.text_msg_user_name = (TextView) convertView.findViewById(R.id.text_msg_user_name);
holder.text_msg_infos = (TextView) convertView.findViewById(R.id.text_msg_infos); convertView.setTag(holder); } else {
holder = (ViewHolder) convertView.getTag();
}
final Msg myMsg = mDatas.get(position); if (myMsg != null) { if (myMsg.isRead) {//未读
holder.img_msg.setImageResource(R.mipmap.readed_msg_img);
} else {
holder.img_msg.setImageResource(R.mipmap.unread_msg_img);
} holder.text_msg_user_name.setText(myMsg.title);
holder.text_msg_infos.setText(myMsg.desc);
} return convertView;
} class ViewHolder { ImageView img_msg; TextView text_msg_user_name; TextView text_msg_infos;
}
}

注: 此处重写了父类中的getItemViewType方法,该方法中,我们根据Msg的isRead字段来判断返回值的是0还是1; 之后,我们将根据该返回值,来判断list item的菜单是何种类型!

2. 根据ItemViewType,创建滑动菜单:

import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.TypedValue;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Toast; import com.apkfuns.logutils.LogUtils;
import com.baoyz.swipemenulistview.SwipeMenu;
import com.baoyz.swipemenulistview.SwipeMenuCreator;
import com.baoyz.swipemenulistview.SwipeMenuItem;
import com.baoyz.swipemenulistview.SwipeMenuListView; import java.util.ArrayList;
import java.util.List; import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnItemClick; public class MainActivity extends AppCompatActivity { // 方案列表
@Bind(R.id.listViewMyMsgs)
public SwipeMenuListView listViewMyMsgs; private MyMsgAdapter msgAdapter; // 消息集合
private List<Msg> msgs; // 要删除的数据
private Msg dMsg; // 要修改的数据
private int oPos; private Msg oMyMsg; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ButterKnife.bind(this); msgs = new ArrayList<Msg>(); Msg msg1 = new Msg();
msg1.id = 1;
msg1.title = "上邪";
msg1.desc = "我欲与君相知,长命无绝衰";
msg1.isRead = false; Msg msg2 = new Msg();
msg2.id = 2;
msg2.title = "爱在记忆中找你";
msg2.desc = "如果可以恨你,全力痛恨你,连遇上亦要躲避";
msg2.isRead = true; msgs.add(msg1);
msgs.add(msg2); msgAdapter = new MyMsgAdapter(this, msgs);
listViewMyMsgs.setAdapter(msgAdapter); createMenu();
} /**
* 删除某个消息
*
* @param position
*/
private void deleteMsg(int position) {
// DoDeleteMsgRequest(String id,Handler mHandler, int reqCode)
dMsg = msgs.get(position);
if (dMsg != null) {
Toast.makeText(MainActivity.this, "删除 : " + dMsg, Toast.LENGTH_SHORT).show(); msgs.remove(dMsg);
msgAdapter.notifyDataSetChanged();
}
} /**
* 标记已读和未读
*
* @param position
*/
private void readMsg(int position) {
//DoReadMsgRequest(String id, String isRead, Handler mHandler, int reqCode)
oPos = position;
oMyMsg = msgs.get(position);
if (oMyMsg != null) {
msgs.get(position).isRead = !msgs.get(position).isRead; msgAdapter.notifyDataSetChanged();
}
} private void createMenu() {
// step 1. create a MenuCreator
SwipeMenuCreator creator = new SwipeMenuCreator() {
@Override
public void create(SwipeMenu menu) {
switch (menu.getViewType()) {
case 0:// 未读
createMenu1(menu);
break;
case 1:// 已读
createMenu2(menu);
break;
}
} private void createMenu1(SwipeMenu menu) {
SwipeMenuItem unreadItem = new SwipeMenuItem(
getApplicationContext());
unreadItem.setId(1);
unreadItem.setBackground(new ColorDrawable(Color.parseColor("#555555")));
unreadItem.setWidth(dp2px(90));
unreadItem.setTitle("标为已读");
unreadItem.setTitleSize(16);
unreadItem.setTitleColor(Color.parseColor("#FFFFFF"));
menu.addMenuItem(unreadItem); SwipeMenuItem deleteItem = new SwipeMenuItem(
getApplicationContext());
deleteItem.setId(0);
deleteItem.setBackground(new ColorDrawable(Color.parseColor("#EF4B3A")));
deleteItem.setWidth(dp2px(90));
deleteItem.setTitle("删除");
deleteItem.setTitleSize(16);
deleteItem.setTitleColor(Color.parseColor("#FFFFFF"));
menu.addMenuItem(deleteItem);
} private void createMenu2(SwipeMenu menu) {
SwipeMenuItem readedItem = new SwipeMenuItem(
getApplicationContext());
readedItem.setId(2);
readedItem.setBackground(new ColorDrawable(Color.parseColor("#555555")));
readedItem.setWidth(dp2px(90));
readedItem.setTitle("标记未读");
readedItem.setTitleSize(16);
readedItem.setTitleColor(Color.parseColor("#FFFFFF"));
menu.addMenuItem(readedItem); SwipeMenuItem deleteItem = new SwipeMenuItem(
getApplicationContext());
deleteItem.setId(0);
deleteItem.setBackground(new ColorDrawable(Color.parseColor("#EF4B3A")));
deleteItem.setWidth(dp2px(90));
deleteItem.setTitle("删除");
deleteItem.setTitleSize(16);
deleteItem.setTitleColor(Color.parseColor("#FFFFFF"));
menu.addMenuItem(deleteItem);
}
};
// set creator
listViewMyMsgs.setMenuCreator(creator); // step 2. listener item click event
listViewMyMsgs.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(int position, SwipeMenu menu, int index) { SwipeMenuItem menuItem = menu.getMenuItem(index);
int id = menuItem.getId();
switch (id) {
case 0:
LogUtils.e("删除 :" + position);
deleteMsg(position);
break;
case 1:
LogUtils.e("标记未读 :" + position);
readMsg(position);
break;
case 2:
LogUtils.e("标为已读 :" + position);
readMsg(position);
break;
}
return false;
}
});
} @OnItemClick(R.id.listViewMyMsgs)
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Msg myMsg = (Msg) parent.getAdapter().getItem(
position);
if (myMsg != null) { if (myMsg.isRead) { // 如果是未读,需要标记为已读
readMsg(position);
}
}
} private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
getResources().getDisplayMetrics());
}
}

注: 着重看下SwipeMenuCreator接口中的public void create(SwipeMenu menu)方法,通过menu.getViewType()方法,我们可以得到该list item的viewType,而这个viewType,使我们刚刚在Adapter自己定义的,所以此时,只需要判断自己所定义的viewType值,并根据viewType来创建菜单即可!

如此这般,便可实现类似QQ滑动弹出菜单标记已读、未读消息功能啦,欢迎指正!

如有疑问,欢迎进QQ群:487786925( Android研发村 )

源码下载地址:https://github.com/zuiwuyuan/SwipeRefreshStickyList

Android 高仿QQ滑动弹出菜单标记已读、未读消息的更多相关文章

  1. Android高仿qq及微信底部菜单的几种实现方式

    最近项目没那么忙,想着开发app的话,有很多都是重复,既然是重复的,那就没有必要每次都去写,所以就想着写一个app通用的基本框架,这里说的框架不是什么MVC,MVP,MVVM这种,而是app开发的通用 ...

  2. android Activity实现底部滑动弹出窗口及源码下载地址

    在做微信.微博.qq等分享时,一般是点击分享按钮后会从底部弹出滑动窗口,然后选择要分享的社交平台进行分享.今日头条.腾讯新闻等内容App的评论也是从底部滑动弹出输入窗口,进行评论输入的.本篇文章就讲讲 ...

  3. Android 高仿QQ5.2双向側滑菜单DrawerLayout实现源代码

    Android 高仿QQ5.2双向側滑菜单DrawerLayout实现源代码 左右側滑效果图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a ...

  4. 史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS。

    重要的话 开头说,not for the RecyclerView or ListView, for the Any ViewGroup. 本控件不依赖任何父布局,不是针对 RecyclerView. ...

  5. Android DrawerLayout 高仿QQ5.2双向侧滑菜单

    1.概述 之前写了一个Android 高仿 QQ5.0 侧滑菜单效果 自定义控件来袭 ,恰逢QQ5.2又加了一个右侧菜单,刚好看了下DrawerLayout,一方面官方的东西,我都比较感兴趣:另一方面 ...

  6. android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码

    Android精选源码 android模仿支付宝app"记账本"模块源码 android一个超轻量级剪贴板历史记录管理软件源码 android模仿QQ拖动红点消失动画效果源码 展示 ...

  7. Android实现高仿QQ附近的人搜索展示

    本文主要实现了高仿QQ附近的人搜索展示,用到了自定义控件的方法 最终效果如下 1.下面展示列表我们可以使用ViewPager来实现(当然如果你不觉得麻烦,你也可以用HorizontalScrollVi ...

  8. iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码

    iOS精选源码 TYCyclePagerView iOS上的一个无限循环轮播图组件 iOS高仿微信完整项目源码 想要更简单的推送消息,看本文就对了 ScrollView嵌套ScrolloView解决方 ...

  9. (android高仿系列)今日头条 --新闻阅读器 (二)

    高仿今日头条 --- 第一篇:(android高仿系列)今日头条 --新闻阅读器 (一)    上次,已经完毕了头部新闻分类栏目的拖动效果. 这篇文章是继续去完好APP 今日头条  这个新闻阅读器的其 ...

随机推荐

  1. html中有序列表标签ol,li的高级应用

    本文主要介绍html中有序列表标签ol,li的高级应用, 在网页设计时我们设计有序列表内容时,经常会在每个ITEM前手工加上一个数值,或是由程序加上这个数值. 而如果使用有序列表标签ol和li,则不需 ...

  2. FreeMarker 对null值的处理技巧

    以下引用官方描述: ? The FreeMarker template language doesn't know the Java language null at all. It doesn't ...

  3. http响应头信息

    HTTP 响应头信息 HTTP请求头提供了关于请求,响应或者其他的发送实体的信息. 在本章节中我们将具体来介绍HTTP响应头信息. 应答头 说明 Allow 服务器支持哪些请求方法(如GET.POST ...

  4. Vue2.0史上最全入坑教程(下)—— 实战案例

    书接上文 前言:经过前两节的学习,我们已经可以创建一个vue工程了.下面我们将一起来学习制作一个简单的实战案例. 说明:默认我们已经用vue-cli(vue脚手架或称前端自动化构建工具)创建好项目了 ...

  5. config.js配置页面中的样式和图片路径

    这个文章用在什么地方,我先说一下,上周啊,我接到一个任务.因为公司业务要对接不同的银行,例如在工行下颜色是红色的,在其他银行下默认为蓝色,所以在页面一致的情况下,保证页面中的按钮和ICON是可以配置的 ...

  6. ubuntu上源码编译安装mysql5.7.27

    一.查看操作系统环境和目录结构,并创建mysql用户和组,以及规划安装mysql所需要的目录. #cat /etc/issue 查看发行版本信息: #cat  /proc/version 查看正在运行 ...

  7. JavaScript远程调用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. R语言基础画图/绘图/作图

    R语言基础画图/绘图/作图 R语言基础画图 R语言免费且开源,其强大和自由的画图功能,深受广大学生和可视化工作人员喜爱,这篇文章对如何使用R语言作基本的图形,如直方图,点图,饼状图以及箱线图进行简单介 ...

  9. AndroidStudio离线打包MUI

    1.下载5+SKD http://ask.dcloud.net.cn/article/103 2.解压到任意目录 3.导入HBuilder-Hello项目 4.在AndroidManifest.xml ...

  10. PrintStream 类

    5.PrintStream类(重点) (1)基本概念 java.io.PrintStream类用于打印各种数据内容.   (2)常用的方法 PrintStream(OutputStream out) ...