首页 > 系统 > Android > 正文

Android仿微信实现左滑显示删除按钮功能

2019-10-21 21:36:19
字体:
来源:转载
供稿:网友

在实际项目中删除列表中的某一项是非常常见的功能,传统的做法可以使用长按监听器等,而现在流行的做法是左滑弹出删除按钮,微信,QQ等都是这么做的,下面做一个示例,代码如下:

主页面MainActivity:代码比较简单常规

package com.home.testslideview; import java.util.ArrayList;import java.util.List; import android.app.Activity;import android.os.Bundle;import android.widget.ListView; import com.home.textslideview.R; public class MainActivity extends Activity {  private ListView listView;  private List<NewInfoBean> list = new ArrayList<NewInfoBean>();  // 适配器 private SlideAdapter adapter;  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initView(); initData(); setAdapter(); }  /** * 初始化页面控件 */ private void initView() { listView = (ListView) findViewById(R.id.main_lv); }  /** * 初始化数据 */ private void initData() { list.add(new NewInfoBean("这是测试内容1")); list.add(new NewInfoBean("这是测试内容2")); list.add(new NewInfoBean("这是测试内容3")); list.add(new NewInfoBean("这是测试内容4")); list.add(new NewInfoBean("这是测试内容5")); list.add(new NewInfoBean("这是测试内容6")); list.add(new NewInfoBean("这是测试内容7")); list.add(new NewInfoBean("这是测试内容8")); list.add(new NewInfoBean("这是测试内容9")); list.add(new NewInfoBean("这是测试内容10")); }  /** * 设置适配器 */ private void setAdapter() { if (adapter == null) { adapter = new SlideAdapter(this, list); listView.setAdapter(adapter); } else { adapter.setList(list); adapter.notifyDataSetChanged(); } } }

实体类NewInfoBean:具体项目中由自己定义:

package com.home.testslideview; public class NewInfoBean { public SlideView slideView;  private String content;  public SlideView getSlideView() { return slideView; }  public void setSlideView(SlideView slideView) { this.slideView = slideView; }  public String getContent() { return content; }  public void setContent(String content) { this.content = content; }  public NewInfoBean() { super(); }  public NewInfoBean(String content) { super(); this.content = content; } }

适配器SlideAdapter:也比较简单

package com.home.testslideview; import java.util.List; import android.content.Context;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView; import com.home.testslideview.SlideView.OnSlideListener;import com.home.textslideview.R; public class SlideAdapter extends BaseAdapter implements OnSlideListener, OnClickListener {  private LayoutInflater inflater;  private List<NewInfoBean> list;  private Context context;  public SlideAdapter(Context context, List<NewInfoBean> list) { if (inflater == null) { inflater = LayoutInflater.from(context); } this.list = list; this.context = context; }  @Override public int getCount() { return list.size(); }  @Override public Object getItem(int position) { return list.get(position); }  @Override public long getItemId(int position) { return position; }  @Override public View getView(int position, View convertView, ViewGroup arg2) {  SlideView slideView = (SlideView) convertView; NewInfoBean bean = list.get(position); if (slideView == null) { slideView = new SlideView(context); slideView.setOnSlideListener(this); }  // 设置内容 TextView contentText = getAdapterView(slideView, R.id.slideview_tv_content, position); contentText.setText(bean.getContent());  // 删除按钮 TextView delText = getAdapterView(slideView, R.id.slideview_tv_del, position); delText.setOnClickListener(this);  bean.slideView = slideView; bean.slideView.shrink();  return slideView; }  @SuppressWarnings("unchecked") public <T extends View> T getAdapterView(View convertView, int id, Object tag) { SparseArray<View> viewHolder = null; try { if (convertView.getTag(R.id.view_holder) instanceof SparseArray<?>) { viewHolder = (SparseArray<View>) convertView  .getTag(R.id.view_holder); } } catch (ClassCastException e) { } if (viewHolder == null) { viewHolder = new SparseArray<View>(); convertView.setTag(R.id.view_holder, viewHolder); convertView.setTag(R.id.order_id, tag); } View childView = viewHolder.get(id); if (childView == null) { childView = convertView.findViewById(id); childView.setTag(tag); viewHolder.put(id, childView); } return (T) childView; }  public List<NewInfoBean> getList() { return list; }  public void setList(List<NewInfoBean> list) { this.list = list; }  @Override public void onSlide(View view, int status) { }  @Override public void onClick(View v) { switch (v.getId()) { case R.id.slideview_tv_del: int position = (Integer) v.getTag(); list.remove(position); notifyDataSetChanged(); break;  default: break; } } }

比较关键的两个类:

自定义的ListView:SlideListView

 

package com.home.testslideview; import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.ListView; public class SlideListView extends ListView {  private SlideView itemView;  public SlideListView(Context context) { super(context); }  public SlideListView(Context context, AttributeSet attrs) { super(context, attrs); }  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); if (position != INVALID_POSITION) { NewInfoBean data = (NewInfoBean) getItemAtPosition(position); itemView = data.slideView; } } default: break; }  if (itemView != null) { itemView.onRequireTouchEvent(event); }  return super.onTouchEvent(event); } }

自定义的ListView中的每一行控件:SlideView(借鉴网上的一个示例):

package com.home.testslideview; import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.widget.LinearLayout;import android.widget.Scroller; import com.home.textslideview.R; public class SlideView extends LinearLayout {  private static final String TAG = SlideView.class.getSimpleName();  private Context mContext; private Scroller mScroller; private OnSlideListener mOnSlideListener;  private int mHolderWidth = 80;  private int mLastX = 0; private int mLastY = 0; private static final int TAN = 2;  private LayoutInflater inflater;  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(); if (inflater == null) { inflater = LayoutInflater.from(mContext); } mScroller = new Scroller(mContext);  setOrientation(LinearLayout.HORIZONTAL); View.inflate(mContext, R.layout.slide_view_merge, this); mHolderWidth = Math.round(TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, mHolderWidth, getResources()  .getDisplayMetrics())); }  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(); } } }

main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >   <com.home.testslideview.SlideListView  android:id="@+id/main_lv"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:cacheColorHint="#00000000"  android:fadingEdge="none"  android:listSelector="#00000000"  android:scrollbars="none" /> </LinearLayout>

slide_view_merge.xml:

<?xml version="1.0" encoding="utf-8"?><merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" >  <LinearLayout  android:id="@+id/slideview_layout_content"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:layout_gravity="center_vertical"  android:gravity="center_vertical"  android:orientation="horizontal" >    <TextView    android:id="@+id/slideview_tv_content"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:text="内容部分"/>  </LinearLayout>  <LinearLayout  android:id="@+id/view_layout_del"  android:layout_width="80dp"  android:layout_height="match_parent"  android:layout_gravity="center_vertical"  android:layout_toRightOf="@id/slideview_layout_content"  android:clickable="true"  android:gravity="center_vertical"  android:orientation="horizontal" >   <TextView   android:id="@+id/slideview_tv_del"   android:layout_width="80dp"   android:layout_height="match_parent"   android:layout_marginBottom="2dp"   android:gravity="center"   android:padding="15dp"   android:text="删除"/>  </LinearLayout> </merge>

源码下载:高仿微信左滑删除效果

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


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表