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

2020-10-29 13:10:29 浏览数 (1)

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

效果图

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

代码语言:javascript复制
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(); 
} 
} 
} 
代码语言:javascript复制
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); 
} 
} 
代码语言:javascript复制
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 人点赞