热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android仿QQ滑动弹出菜单标记已读、未读消息

这篇文章主要介绍了Android仿QQ滑动弹出菜单标记已读、未读消息的相关资料,需要的朋友可以参考下

在上一篇《Android仿微信滑动弹出编辑、删除菜单效果、增加下拉刷新功能》里,已经带着大家学习如何使用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 mDatas; 
 
  public MyMsgAdapter(Activity context, List 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的菜单是何种类型!

4. 根据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 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 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<&#63;> 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滑动弹出菜单标记已读、未读消息功能啦,希望大家喜欢。


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • jmeter实践:从csv中获取带引号的数据详情的技巧和运行全部数据的方法
    本文分享了jmeter实践中从csv中获取带引号的数据的解决办法,包括设置CSV Data Set Config和运行脚本获取数据的方法。另外还介绍了循环运行csv中全部数据的解决方法,避免每次修改csv用例都需要修改脚本的麻烦。通过了解和掌握工具的细节点,可以更好地解决问题和提高技术水平。 ... [详细]
  • 仙贝旅行是日本最大的旅游服务平台之一,为广大用户提供优质的日本定制游服务。随着用户数量的增长,仙贝旅行决定与智齿科技合作,全面替换原有客服系统,打造全新的在线客服体系。该体系具备多渠道快速接入的能力,让仙贝旅行轻松与各个渠道的接入用户完成沟通。同时,机器人与人工协同发力,提升客户服务水平。 ... [详细]
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 企业数据应用挑战及元数据管理的重要性
    本文主要介绍了企业在日常经营管理过程中面临的数据应用挑战,包括数据找不到、数据读不懂、数据不可信等问题。针对这些挑战,通过元数据管理可以实现数据的可见、可懂、可用,帮助业务快速获取所需数据。文章提出了“灵魂”三问——元数据是什么、有什么用、又该怎么管,强调了元数据管理在企业数据治理中的基础和前提作用。 ... [详细]
  • 智能消息服务数字短信使用FAQ
    本文介绍了智能消息服务数字短信的开通流程和操作步骤,包括开通数字短信的路径、申请流程、控制台操作以及API接口对接模式。同时还介绍了数字短信模板的创建规则和要求,包括审核状态的说明和建议。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 微信开放外链的第二阶段:腾讯和阿里巴巴的博弈
    2021年11月30日,微信开始进行“开放外链”的第二阶段,允许在微信个人会话中打开外部链接和在微信群中打开电商链接。虽然这是腾讯和阿里巴巴都能接受的阶段性结果,但双方都不会太满意。接下来几个月,腾讯和阿里将展开复杂的博弈,我们作为外人很难看清全过程。工信部从未要求腾讯无条件开放微信API,本次开放的也只是普通的HTTP链接。 ... [详细]
  • 小程序获取用户信息按钮返回中文地址
    1.我是根据官方文档中描述去写的按钮 可以看到button中加了zh_CNopen-typegetUserInfobindgetuserinfogetU ... [详细]
  • 微信朋友圈屏蔽设置教程,轻松屏蔽无关信息
    自从微信朋友圈越来越受欢迎,很多人想知道如何屏蔽一些不想看的朋友圈信息。本文提供了屏蔽设置教程,通过点击「我」-「相册」-「…」选项 -「消息列表」,左滑即可选择「不再通知」和「删除」某条朋友圈评论或点赞。想重新接收信息时,只需左滑即可。通过这些简单操作,您可以轻松屏蔽无关信息。 ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
author-avatar
mobiledu2502889793
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有