Android仿QQ首页ListView左滑置顶、删除功能

Android 仿QQ首页ListView左滑置顶、删除等实现源码,具体内容如下

效果图

实现源码:package com.duguang.baseanimation.ui.listivew.deletelistview;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Scroller;
import android.widget.TextView; 

import com.kayak.deletelistview.R; 

public class SlideView extends LinearLayout { 

 private static final String TAG = "SlideView"; 

 private Context mContext;
 private LinearLayout mViewContent;
 private RelativeLayout mHolder;
 private Scroller mScroller;
 private OnSlideListener mOnSlideListener; 

 private int mHolderWidth = 120; 

 private int mLastX = 0;
 private int mLastY = 0;
 private static final int TAN = 2; 

 public interface OnSlideListener {
  public static final int SLIDE_STATUS_OFF = 0;
  public static final int SLIDE_STATUS_START_SCROLL = 1;
  public static final int SLIDE_STATUS_ON = 2; 

  /**
   * @param view current SlideView
   * @param status SLIDE_STATUS_ON or SLIDE_STATUS_OFF
   */
  public void onSlide(View view, int status);
 } 

 public SlideView(Context context) {
  super(context);
  initView();
 } 

 public SlideView(Context context, AttributeSet attrs) {
  super(context, attrs);
  initView();
 } 

 private void initView() {
  mContext = getContext();
  mScroller = new Scroller(mContext); 

  setOrientation(LinearLayout.HORIZONTAL);
  View.inflate(mContext, R.layout.activity_listview_delete_slide_view_merge, this);
  mViewContent = (LinearLayout) findViewById(R.id.view_content);
  mHolderWidth = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, mHolderWidth, getResources()
      .getDisplayMetrics()));
 } 

 public void setButtonText(CharSequence text) {
  ((TextView)findViewById(R.id.delete)).setText(text);
 } 

 public void setContentView(View view) {
  mViewContent.addView(view);
 } 

 public void setOnSlideListener(OnSlideListener onSlideListener) {
  mOnSlideListener = onSlideListener;
 } 

 public void shrink() {
  if (getScrollX() != 0) {
   this.smoothScrollTo(0, 0);
  }
 } 

 public void onRequireTouchEvent(MotionEvent event) {
  int x = (int) event.getX();
  int y = (int) event.getY();
  int scrollX = getScrollX();
  Log.d(TAG, "x=" + x + " y=" + y); 

  switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN: {
   if (!mScroller.isFinished()) {
    mScroller.abortAnimation();
   }
   if (mOnSlideListener != null) {
    mOnSlideListener.onSlide(this,
      OnSlideListener.SLIDE_STATUS_START_SCROLL);
   }
   break;
  }
  case MotionEvent.ACTION_MOVE: {
   int deltaX = x - mLastX;
   int deltaY = y - mLastY;
   if (Math.abs(deltaX) < Math.abs(deltaY) * TAN) {
    break;
   } 

   int newScrollX = scrollX - deltaX;
   if (deltaX != 0) {
    if (newScrollX < 0) {
     newScrollX = 0;
    } else if (newScrollX > mHolderWidth) {
     newScrollX = mHolderWidth;
    }
    this.scrollTo(newScrollX, 0);
   }
   break;
  }
  case MotionEvent.ACTION_UP: {
   int newScrollX = 0;
   if (scrollX - mHolderWidth * 0.75 > 0) {
    newScrollX = mHolderWidth;
   }
   this.smoothScrollTo(newScrollX, 0);
   if (mOnSlideListener != null) {
    mOnSlideListener.onSlide(this,
      newScrollX == 0 ? OnSlideListener.SLIDE_STATUS_OFF
        : OnSlideListener.SLIDE_STATUS_ON);
   }
   break;
  }
  default:
   break;
  } 

  mLastX = x;
  mLastY = y;
 } 

 private void smoothScrollTo(int destX, int destY) {
  // 缓慢滚动到指定位置
  int scrollX = getScrollX();
  int delta = destX - scrollX;
  mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta) * 3);
  invalidate();
 } 

 @Override
 public void computeScroll() {
  if (mScroller.computeScrollOffset()) {
   scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
   postInvalidate();
  }
 } 

}
package com.duguang.baseanimation.ui.listivew.deletelistview; 

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ListView; 

import com.duguang.baseanimation.ui.listivew.deletelistview.DeleteListViewMainActivity.MessageItem; 

public class ListViewCompat extends ListView { 

 private static final String TAG = "ListViewCompat"; 

 private SlideView mFocusedItemView; 

 public ListViewCompat(Context context) {
  super(context);
 } 

 public ListViewCompat(Context context, AttributeSet attrs) {
  super(context, attrs);
 } 

 public ListViewCompat(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
 } 

 public void shrinkListItem(int position) {
  View item = getChildAt(position); 

  if (item != null) {
   try {
    ((SlideView) item).shrink();
   } catch (ClassCastException e) {
    e.printStackTrace();
   }
  }
 } 

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN: {
   int x = (int) event.getX();
   int y = (int) event.getY();
   int position = pointToPosition(x, y);
   Log.e(TAG, "postion=" + position);
   if (position != INVALID_POSITION) {
    MessageItem data = (MessageItem) getItemAtPosition(position);
    mFocusedItemView = data.slideView;
    Log.e(TAG, "FocusedItemView=" + mFocusedItemView);
   }
  }
  default:
   break;
  } 

  if (mFocusedItemView != null) {
   mFocusedItemView.onRequireTouchEvent(event);
  } 

  return super.onTouchEvent(event);
 } 

}
package com.duguang.baseanimation.ui.listivew.deletelistview; 

import java.util.ArrayList;
import java.util.List; 

import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast; 

import com.duguang.baseanimation.ui.base.BaseActivity;
import com.duguang.baseanimation.ui.listivew.deletelistview.SlideView.OnSlideListener;
import com.kayak.deletelistview.R; 

public class DeleteListViewMainActivity extends BaseActivity implements OnItemClickListener, OnClickListener,
  OnSlideListener { 

 private static final String TAG = "MainActivity"; 

 private ListViewCompat mListView; 

 private List<MessageItem> mMessageItems = new ArrayList<DeleteListViewMainActivity.MessageItem>(); 

 private SlideView mLastSlideViewWithStatusOn; 

 private SlideAdapter adapter; 

 @Override
 public void setView() {
   setContentView(R.layout.activity_listview_delete_main); 

 } 

 @Override
 public void initView() {
   mListView = (ListViewCompat) findViewById(R.id.list); 

   for (int i = 0; i < 20; i++) {
    MessageItem item = new MessageItem();
    if (i % 3 == 0) {
     item.iconRes = R.drawable.delete_default_qq_avatar;
     item.title = "腾讯新闻";
     item.msg = "青岛爆炸满月:大量鱼虾死亡";
     item.time = "晚上18:18";
    } else {
     item.iconRes = R.drawable.delete_wechat_icon;
     item.title = "微信团队";
     item.msg = "欢迎你使用微信";
     item.time = "12月18日";
    }
    mMessageItems.add(item);
   } 

   adapter = new SlideAdapter();
   mListView.setAdapter(adapter);
   mListView.setOnItemClickListener(this); 

 } 

 @Override
 public void setListener() {
  // TODO Auto-generated method stub 

 } 

 private class SlideAdapter extends BaseAdapter { 

  private LayoutInflater mInflater;
  SlideAdapter() {
   super();
   mInflater = getLayoutInflater();
  } 

  @Override
  public int getCount() {
   return mMessageItems.size();
  } 

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

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

  @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
   ViewHolder holder;
   SlideView slideView = (SlideView) convertView;
   if (slideView == null) {
    View itemView = mInflater.inflate(R.layout.item_listview_delete, null); 

    slideView = new SlideView(DeleteListViewMainActivity.this);
    slideView.setContentView(itemView); 

    holder = new ViewHolder(slideView);
    slideView.setOnSlideListener(DeleteListViewMainActivity.this);
    slideView.setTag(holder);
   } else {
    holder = (ViewHolder) slideView.getTag();
   }
   MessageItem item = mMessageItems.get(position);
   item.slideView = slideView;
   item.slideView.shrink(); 

   holder.icon.setImageResource(item.iconRes);
   holder.title.setText(item.title);
   holder.msg.setText(item.msg);
   holder.time.setText(item.time);
   holder.deleteHolder.setOnClickListener(new OnClickListener() { 

    @Override
    public void onClick(View v) {
     mMessageItems.remove(position);
     adapter.notifyDataSetChanged();
     Toast.makeText(DeleteListViewMainActivity.this, "删除第" + position+"个条目", 0).show();
    }
   }); 

   return slideView;
  } 

 } 

 public class MessageItem {
  public int iconRes;
  public String title;
  public String msg;
  public String time;
  public SlideView slideView;
 } 

 private static class ViewHolder {
  public ImageView icon;
  public TextView title;
  public TextView msg;
  public TextView time;
  public ViewGroup deleteHolder; 

  ViewHolder(View view) {
   icon = (ImageView) view.findViewById(R.id.icon);
   title = (TextView) view.findViewById(R.id.title);
   msg = (TextView) view.findViewById(R.id.msg);
   time = (TextView) view.findViewById(R.id.time);
   deleteHolder = (ViewGroup)view.findViewById(R.id.holder);
  }
 } 

 @Override
 public void onItemClick(AdapterView<?> parent, View view, int position,
   long id) {
  Toast.makeText(this, "onItemClick position=" + position, 0).show(); 

 } 

 @Override
 public void onSlide(View view, int status) {
  if (mLastSlideViewWithStatusOn != null && mLastSlideViewWithStatusOn != view) {
   mLastSlideViewWithStatusOn.shrink();
  } 

  if (status == SLIDE_STATUS_ON) {
   mLastSlideViewWithStatusOn = (SlideView) view;
  }
 } 

 @Override
 public void onClick(View v) {
  switch (v.getId()) {
 case R.id.holder: 

  break; 

 default:
  break;
 }
 } 

}

源码下载地址:Android仿QQ左滑置顶删除功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android高仿QQ6.0侧滑删除实例代码

    推荐阅读: 先给大家分享一下,侧滑删除,布局也就是前面一个item,然后有两个隐藏的按钮(TextView也可以),然后我们可以向左侧滑动,然后显示出来,然后对delete(删除键)实现监听,就可以了哈.好了那就来看看代码怎么实现的吧. 首先和之前一样 自定义View,初始化ViewDragHelper: package com.example.removesidepull; import android.content.Context; import android.support.v4.wi

  • Android仿QQ长按删除弹出框功能示例

    废话不说,先看一下效果图,如果大家感觉不错,请参考实现代码: 对于列表来说,如果想操作某个列表项,一般会采用长按弹出菜单的形式,默认的上下文菜单比较难看,而QQ的上下文菜单就人性化多了,整个菜单给用户一种气泡弹出的感觉,而且会显示在手指按下的位置,而技术实现我之前是使用popupWindow和RecyclerView实现的,上面一个RecyclerView,下面一个小箭头ImageView,但后来发现没有必要,而且可定制化也不高,还是使用多个TextView更好一点. 我封装了一下,只需要一个P

  • Android仿QQ微信侧滑删除效果

    仿QQ侧滑删除效果图 1.自定义listview public class DragDelListView extends ListView { private boolean moveable=false; private boolean closed=true; private float mDownX,mDownY; private int mTouchPosition,oldPosition=-1; private DragDelItem mTouchView,oldView; priv

  • Android仿QQ左滑删除置顶ListView操作

    最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图: 大致思路原理: - 通过设置margin实现菜单的显示与隐藏 - 监听onTouchEvent,处理滑动事件 上代码 import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.v

  • Android使用SwipeListView实现类似QQ的滑动删除效果

    QQ的滑动删除效果很不错,要实现这种效果,可以使用SwipeListView. 1. 下载com.fortysevendeg.swipelistview这个项目(以前GitHub上有,现在GitHub上没有了,百度了很多次才下载到的),导入Eclipse,右键单击,选择Properties->Android,选中Library下面的IsLibrary. 2. 新建一个项目MySwipeListView,加入SwipeListView这个库. 3. 在主窗体里面放入一个SwipeListView控

  • Android实现QQ侧滑(删除、置顶等)功能

    实现类似QQ滑动出现可操作项的功能,在网上看到有人自定义LinearLayout实现这个效果,但是灵活性有限.此demo使用开源项目SwipeLayout实现该功能.关于SwipeLayout的常用设置和属性,这里都做介绍,下面进入正题. 一.效果图 二.代码片段 主页布局和主页的Java代码都和平时使用没有区别,代码没必要贴出来了.这里使用的ListView演示,还可以是GridView,ExpandableListView. 最关键的代码部分,ListView适配器布局: <?xml ver

  • Android App中ListView仿QQ实现滑动删除效果的要点解析

    本来准备在ListView的每个Item的布局上设置一个隐藏的Button,当滑动的时候显示.但是因为每次只要存在一个Button,发现每个Item上的Button相互间不好控制.所以决定继承ListView然后结合PopupWindow. 首先是布局文件: delete_btn.xml:这里只需要一个Button <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=

  • Android仿QQ列表左滑删除操作

    最近学习了如何做一个像QQ的左滑RecyclerView的item显示选项的,主要是用到Scroller 我们首先新建一个自己的RecyclerView 定义好一些要用的的变量 重写构造方法,把前两个构造方法改为如下,使无论如何构造都要执行第三个构造方法 在第三个构造方法里初始化Scroller public class LeftSwipeMenuRecyclerView extends RecyclerView { //置顶按钮 private TextView tvTop; //删除按钮 p

  • Android开发中模仿qq列表信息滑动删除功能

    这个效果的完成主要分为两个部分 自定义view作为listview的列表项 一个view里面包括 显示头像,名字,消息内容等的contentView和滑动才能显示出来的删除,置顶的右边菜单menuView 在手指移动的时候同时改变这两个视图的位置 重写listview 判断item向左还是向右滑动 正常的滚动还是左右滑动等等 重写onTouchEvent 进行事件分发 大致思路: listview进行事件分发,判断需要滑动还是滚动等状态,如果需要滑动将事件传递给item进行滑动处理. 在item

  • Android仿QQ首页ListView左滑置顶、删除功能

    Android 仿QQ首页ListView左滑置顶.删除等实现源码,具体内容如下 效果图 实现源码:package com.duguang.baseanimation.ui.listivew.deletelistview; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.

  • mpvue小程序仿qq左滑置顶删除组件

    背景: 前几天,公司的一个小程序项目开发的时候,遇到了一点点问题.设计师这狗币要让我在小程序上实现类似QQ左滑置顶删除的操作,心里mmp,我就是一个刚来公司三天的小小前端实习生而已,我想学习....当然刚刚来就被公司委以重任,也能看出本人技术过人,尤其是作为一个大二刚刚结束的学生来说.废话不多说,对于这个功能,第一反应就是百度,不百度不得了,一百度吓一跳.前辈们也来都做过."那我不是直接照搬就行,开心".开开心心的用mpvue上手之后,心里mmp,mpvue的坑这么多....还不如自己

  • Android 仿微信发动态九宫格拖拽、删除功能

    1.完美1比1 仿照微信仿微信发动态 九宫格拖拽.删除 暴力拖拽ui有点问题,不影响使用,资源文件自己找个+号 2.微信发动态拖拽bug 当选择完图片,长按图片拖拽过程中按下屏幕home键盘,再次进入这时候就不能点击输入文字,点击输入文字的时候会触发选择相册事件 3.拖拽事件用的basequickadapter implementation 'com.android.support:recyclerview-v7:28.0.0' implementation "com.github.CymCha

  • 微信小程序实现左滑修改、删除功能

    本文实例为大家分享了微信小程序实现左滑修改.删除的具体代码,供大家参考,具体内容如下 wxml: <view class="offer-item" wx:for-items='{{offerList}}'> <!--这里绑定了刚才说的3个函数分别为 touchS,touchM touchE--> <!--这里注意这个 style="{{item.txtStyle}}" ,这是我们一会再js中 将要设置的样式 --> <vie

  • vue移动端实现左滑编辑与删除的全过程

    前言 根据项目需要使用 Vue-touch 实现了一个vue移动端的左滑编辑和删除功能,废话不多说,先看效果图,然后上代码吧! 方法如下: 第一步:安装   vue-touch npm install vue-touch@next --save 第二步:main.js 中引入 import VueTouch from 'vue-touch'; Vue.use(VueTouch, { name: 'v-touch' }); 第三步:使用(用v-touch包住你要左滑删除的内容) <div clas

  • Android仿QQ空间动态界面分享功能

    先看看效果: 用极少的代码实现了 动态详情 及 二级评论 的 数据获取与处理 和 UI显示与交互,并且高解耦.高复用.高灵活. 动态列表界面MomentListFragment支持 下拉刷新与上拉加载 和 模糊搜索,反复快速滑动仍然非常流畅. 缓存机制使得数据可在启动界面后瞬间加载完成. 动态详情界面MomentActivity支持 (取消)点赞.(删除)评论.点击姓名跳到个人详情 等. 只有1张图片时图片放大显示,超过1张则按九宫格显示. 用到的CommentContainerView和Mom

  • Android仿QQ空间顶部条背景变化效果

    本文给大家分享仿QQ空间页面顶部条随界面滑动背景透明度变化的效果,这个效果在其他应用程序中也很常见,技能+1. 一.上代码,具体实现 笔者之前的文章第二部分总是二话不说,直接上代码,很干脆,其实更好的方式是引导读者思考:这个效果如何实现.前期做好效果的功能分析,才能读者更好的理解. QQ空间的这个页面其实并不复杂,我们看看QQ空间的演示界面: 可以看见,整个页面其实只有两个根元素,一个是ListView,一个是标题栏,前者可以上下滑动,给用户呈现内容:后者固定位置不动,类似于一个导航栏,左边一个

  • Android仿QQ可拉伸头部控件

    本文实例为大家分享了Android仿QQ可拉伸头部控件的具体实现代码,供大家参考,具体内容如下 该控件大致思路: 1.采用继承listview加入头部view. 2.监听listview滚动. 3.自定义动画回弹. 先看效果吧: activity-main.xml布局如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schema

  • Android仿QQ长按弹出删除复制框

    本文实例为大家分享了Android仿QQ长按删除弹出框的具体代码,供大家参考,具体内容如下 废话不说,先看一下效果图: 对于列表来说,如果想操作某个列表项,一般会采用长按弹出菜单的形式,默认的上下文菜单比较难看,而QQ的上下文菜单就人性化多了,整个菜单给用户一种气泡弹出的感觉,而且会显示在手指按下的位置,而技术实现我之前是使用popupWindow和RecyclerView实现的,上面一个RecyclerView,下面一个小箭头ImageView,但后来发现没有必要,而且可定制化也不高,还是使用

随机推荐