最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android仿微信實(shí)現(xiàn)左滑顯示刪除按鈕功能

 更新時(shí)間:2018年10月30日 11:31:58   作者:馮健-developer  
這篇文章主要為大家詳細(xì)介紹了java仿微信實(shí)現(xiàn)左滑顯示刪除按鈕功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在實(shí)際項(xiàng)目中刪除列表中的某一項(xiàng)是非常常見(jiàn)的功能,傳統(tǒng)的做法可以使用長(zhǎng)按監(jiān)聽器等,而現(xiàn)在流行的做法是左滑彈出刪除按鈕,微信,QQ等都是這么做的,下面做一個(gè)示例,代碼如下:

主頁(yè)面MainActivity:代碼比較簡(jiǎn)單常規(guī)

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();
 }
 
 /**
 * 初始化頁(yè)面控件
 */
 private void initView() {
 listView = (ListView) findViewById(R.id.main_lv);
 }
 
 /**
 * 初始化數(shù)據(jù)
 */
 private void initData() {
 list.add(new NewInfoBean("這是測(cè)試內(nèi)容1"));
 list.add(new NewInfoBean("這是測(cè)試內(nèi)容2"));
 list.add(new NewInfoBean("這是測(cè)試內(nèi)容3"));
 list.add(new NewInfoBean("這是測(cè)試內(nèi)容4"));
 list.add(new NewInfoBean("這是測(cè)試內(nèi)容5"));
 list.add(new NewInfoBean("這是測(cè)試內(nèi)容6"));
 list.add(new NewInfoBean("這是測(cè)試內(nèi)容7"));
 list.add(new NewInfoBean("這是測(cè)試內(nèi)容8"));
 list.add(new NewInfoBean("這是測(cè)試內(nèi)容9"));
 list.add(new NewInfoBean("這是測(cè)試內(nèi)容10"));
 }
 
 /**
 * 設(shè)置適配器
 */
 private void setAdapter() {
 if (adapter == null) {
 adapter = new SlideAdapter(this, list);
 listView.setAdapter(adapter);
 } else {
 adapter.setList(list);
 adapter.notifyDataSetChanged();
 }
 }
 
}

實(shí)體類NewInfoBean:具體項(xiàng)目中由自己定義:

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:也比較簡(jiǎn)單

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);
 }
 
 // 設(shè)置內(nèi)容
 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;
 }
 }
 
}

比較關(guān)鍵的兩個(gè)類:

自定義的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(借鑒網(wǎng)上的一個(gè)示例):

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) {
 // 緩慢滾動(dòng)到指定位置
 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="內(nèi)容部分"/>
 
 </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>

源碼下載:高仿微信左滑刪除效果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java程序部署到服務(wù)器上,接口請(qǐng)求下載文件失敗/文件為空/文件名不對(duì)的問(wèn)題

    Java程序部署到服務(wù)器上,接口請(qǐng)求下載文件失敗/文件為空/文件名不對(duì)的問(wèn)題

    這篇文章主要介紹了Java程序部署到服務(wù)器上,接口請(qǐng)求下載文件失敗/文件為空/文件名不對(duì),本文給大家分享錯(cuò)誤原因及解決方法,需要的朋友可以參考下
    2020-07-07
  • springboot項(xiàng)目使用SchedulingConfigurer實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)的案例代碼

    springboot項(xiàng)目使用SchedulingConfigurer實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)的案例代碼

    這篇文章主要介紹了springboot項(xiàng)目使用SchedulingConfigurer實(shí)現(xiàn)多個(gè)定時(shí)任務(wù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • java Matcher匹配頭尾截取替換字符串的案例

    java Matcher匹配頭尾截取替換字符串的案例

    這篇文章主要介紹了java Matcher匹配頭尾截取替換字符串的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • IDEA中的.iml文件和.idea文件的作用及意義

    IDEA中的.iml文件和.idea文件的作用及意義

    iml是 項(xiàng)目標(biāo)識(shí)文件,每一個(gè)模塊都有一個(gè)iml文件,存儲(chǔ)模塊的相關(guān)信息,跟eclipse的project文件是一樣的功能,這篇文章主要介紹了IDEA中的.iml文件和.idea文件的作用,需要的朋友可以參考下
    2023-09-09
  • JAVA實(shí)現(xiàn)長(zhǎng)連接(含心跳檢測(cè)Demo)

    JAVA實(shí)現(xiàn)長(zhǎng)連接(含心跳檢測(cè)Demo)

    這篇文章主要介紹了JAVA實(shí)現(xiàn)長(zhǎng)連接(含心跳檢測(cè)Demo),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Quarkus改造Pmml模型項(xiàng)目異常記錄及解決處理

    Quarkus改造Pmml模型項(xiàng)目異常記錄及解決處理

    這篇文章主要為大家介紹了Quarkus改造Pmml模型項(xiàng)目是遇到的異常記錄以及解決方法,有需要的同學(xué)可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • java為什么不建議用equals判斷對(duì)象相等

    java為什么不建議用equals判斷對(duì)象相等

    本文主要介紹了java為什么不建議用equals判斷對(duì)象相等,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • MyBatis 延遲加載、一級(jí)緩存、二級(jí)緩存(詳解)

    MyBatis 延遲加載、一級(jí)緩存、二級(jí)緩存(詳解)

    下面小編就為大家?guī)?lái)一篇MyBatis 延遲加載、一級(jí)緩存、二級(jí)緩存(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • MyBatis快速入門(簡(jiǎn)明淺析易懂)

    MyBatis快速入門(簡(jiǎn)明淺析易懂)

    MyBatis是支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。mybatis的學(xué)習(xí)是程序員的必修課。今天小編通過(guò)分享本教程幫助大家快速入門mybatis,對(duì)mybatis入門知識(shí)感興趣的朋友參考下吧
    2016-11-11
  • 一文詳解Java中的AuthRequest類(附Demo)

    一文詳解Java中的AuthRequest類(附Demo)

    公共接口,定義了對(duì)第三方平臺(tái)進(jìn)行授權(quán)、登錄、撤銷授權(quán)和刷新 token 的操作,本文將詳細(xì)分析Java中的AuthRequest類(附Demo),文中通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-04-04

最新評(píng)論

岚皋县| 方山县| 哈尔滨市| 赣州市| 宣武区| 固镇县| 通渭县| 上栗县| 深水埗区| 罗江县| 郑州市| 东平县| 济宁市| 镇康县| 蓝田县| 句容市| 澳门| 政和县| 梅河口市| 新密市| 铜梁县| 玉溪市| 肃宁县| 金阳县| 漯河市| 拜泉县| 台中市| 松桃| 大同市| 宁安市| 浑源县| 梁河县| 武汉市| 历史| 宁海县| 江城| 庐江县| 常山县| 卓资县| 驻马店市| 崇文区|