时间过得真快,国庆小长假就结束了,好伤心呜呜—-已经开始了,我去,已经结束了?明天小伙伴们要继续上班了!该收收心好好工作了!有木有很激动!哈哈!相信大家对listview应该非常熟悉了,可以说耳闻能祥!我这里就不再赘述了,言贵正传!大家先看下效果
主要分为下面五种
-PrivateListingAdapter
-SlideListViewActivity
-SlideListView
-SlideView
-MessageBean
首先说下adapter跟普通适配器一样继承BaseAdapter然后实现OnClickListener监听事件,当用户想有侧滑时移除SlideListView中item中的某一项position,然后notifyDataSetChanged();通知listview刷新数据。
主要代码如下
holder.deleteViewHolder.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// T删除某一个item
mList.remove(position);
//刷新数据
notifyDataSetChanged();
}
});
SlideLsitViewActivity主要负责绑定SlideListView,然后通过更改Model实现数据的更新
private void initView() {
// 初始化操作
mSlideListView=(SlideListView) findViewById(R.id.slidelv);
adapter=new PrivateListingAdapter(this);
//创建一个list列表
ArrayList<MessageBean> mMessageList = new ArrayList<MessageBean>();
for (int i = 0; i < 20; i++) {
//遍历item
MessageBean bean=new MessageBean();
//判断当前取模为3是否等于零然后添加相应的信息
if(i % 3==0){
bean.iconRes=R.drawable.default_qq_avatar;
bean.title="网易新闻";
bean.msg="创智播客创始人猝死";
bean.time="2016-10-06";
}else{
bean.iconRes=R.drawable.wechat_icon;
bean.title="搜狐新闻";
bean.msg="杨洋地铁与粉丝骚扰";
bean.time="2016-10-04";
}
//将Model添加到集合中
mMessageList.add(bean);
}
下面进行适配器的绑定以及实现OnItemClickListener监听事件打印相应的position位置代码如下
adapter.setmMessageItems(mMessageList);
mSlideListView.setAdapter(adapter);
mSlideListView.setOnItemClickListener(this);
SlideListView继承ListView重写ListView中方法以及实现当手指向右滑动的监听记录当前手指记录的x,y轴坐标,然后判断当前是开始滑动,还是停止滑动,还是右滑等,实现代码如下
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
switch (ev.getAction()) {
/**手指按下**/
case MotionEvent.ACTION_DOWN:
int x=(int) ev.getX();
int y=(int) ev.getY();
int pos=pointToPosition(x, y);
Log.i(TAG, "pos="+pos);
if(pos!=INVALID_POSITION){
MessageBean msg=(MessageBean) getItemAtPosition(pos);
mSlideView=msg.mSlideView;
Log.i(TAG, "mSlideView="+mSlideView);
break;
SlideView主要实现手指侧滑时的OnSlideListener事件,代码如下
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_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 >mHoldeWid) {
newScrollX = mHoldeWid;
}
this.scrollTo(newScrollX, 0);
}
break;
}
case MotionEvent.ACTION_UP: {
int newScrollX = 0;
if (scrollX - mHoldeWid * 0.75 > 0) {
newScrollX = mHoldeWid;
}
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;
}
MessageBean 里面主要包括一些图片资源,标题,信息,时间以及SlideView侧滑,代码如下。
public int iconRes;
public String title;
public String msg;
public String time;
public SlideView mSlideView;
基本功能就这些,主要通过手向右侧滑然后删除ListView中某一项的item中position,然后适配器Adapter通知ListView刷新。
下面是全部代码!
package com.zm.ui;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import com.zm.adapter.PrivateListingAdapter;
import com.zm.bean.MessageBean;
import com.zm.view.SlideListView;
import com.zm.view.SlideView;
public class SlideListViewActivity extends Activity implements OnItemClickListener{
private SlideView mSlideView;
private SlideListView mSlideListView;
private PrivateListingAdapter adapter;
private List<MessageBean> mList=new ArrayList<MessageBean>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_privatelist);
initView();
}
private void initView() {
// 初始化操作
mSlideListView=(SlideListView) findViewById(R.id.slidelv);
adapter=new PrivateListingAdapter(this);
ArrayList<MessageBean> mMessageList = new ArrayList<MessageBean>();
for (int i = 0; i < 20; i++) {
MessageBean bean=new MessageBean();
if(i % 3==0){
bean.iconRes=R.drawable.default_qq_avatar;
bean.title="网易新闻";
bean.msg="创智播客创始人猝死";
bean.time="2016-10-06";
}else{
bean.iconRes=R.drawable.wechat_icon;
bean.title="搜狐新闻";
bean.msg="杨洋地铁与粉丝骚扰";
bean.time="2016-10-04";
}
mMessageList.add(bean);
}
adapter.setmMessageItems(mMessageList);
mSlideListView.setAdapter(adapter);
mSlideListView.setOnItemClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
Log.i("tag", "position="+position);
}
}
___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
package com.zm.adapter;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.zm.R;
import com.zm.bean.MessageBean;
import com.zm.view.SlideView;
import com.zm.view.SlideView.onSlideListener;
public class PrivateListingAdapter extends BaseAdapter implements onSlideListener{
private static final String TAG="PrivateListingAdapter";
private Context mContext;
private List<MessageBean> mList =new ArrayList<MessageBean>();
private SlideView mSlideView;
private LayoutInflater mLayoutInflater;
public PrivateListingAdapter(Context context) {
mContext = context;
mLayoutInflater = LayoutInflater.from(mContext);
//mLayoutInflater=(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void setmMessageItems(List<MessageBean> mMessageItems) {
this.mList = mMessageItems;
}
// public PrivateListingAdapter(Context mContext,List<MessageBean> mList){
// this.mContext=mContext;
// this.mList=mList;
// /**获取系统布局服务**/
// mLayoutInflater=LayoutInflater.from(mContext);
//
// }
@Override
public int getCount() {
if(mList==null){
mList=new ArrayList<MessageBean>();
}
return mList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder=null;
SlideView mSlideView=(SlideView) convertView;
if(mSlideView==null){
View item=mLayoutInflater.inflate(R.layout.privatelist_item, null);
mSlideView=new SlideView(mContext);
mSlideView.setContentView(item);
holder=new ViewHolder(mSlideView);
mSlideView.setOnSlideListener(this);
mSlideView.setTag(holder);
}else{
holder=(ViewHolder) mSlideView.getTag();
MessageBean mb=mList.get(position);
mb.mSlideView=mSlideView;
mb.mSlideView.shrink();
holder.iv_icon.setImageResource(mb.iconRes);
holder.tv_title.setText(mb.title);
holder.tv_msg.setText(mb.msg);
holder.tv_time.setText(mb.time);
holder.deleteViewHolder.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// T删除某一个item
mList.remove(position);
//刷新数据
notifyDataSetChanged();
}
});
}
return mSlideView;
}
@Override
public void onSlide(View view, int status) {
// TODO Auto-generated method stub
if(mSlideView!=null&&mSlideView!=view){
mSlideView.shrink();
}
if(status==SLIDE_STATUS_ON){
mSlideView=(SlideView) view;
}
}
private static class ViewHolder{
public ImageView iv_icon;
private TextView tv_title;
public TextView tv_msg;
public TextView tv_time;
public ViewGroup deleteViewHolder;
/**
* 初始化
* @param v
*/
ViewHolder(View v){
iv_icon=(ImageView) v.findViewById(R.id.icon);
tv_title=(TextView) v.findViewById(R.id.title);
tv_msg=(TextView) v.findViewById(R.id.msg);
tv_time=(TextView) v.findViewById(R.id.time);
deleteViewHolder= (ViewGroup) v.findViewById(R.id.holder);
}
}
}
___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
package com.zm.bean;
import com.zm.view.SlideView;
public class MessageBean {
public int iconRes;
public String title;
public String msg;
public String time;
public SlideView mSlideView;
public int getIconRes() {
return iconRes;
}
public void setIconRes(int iconRes) {
this.iconRes = iconRes;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public SlideView getmSlideView() {
return mSlideView;
}
public MessageBean(){
super();
}
public MessageBean(int iconRes, String title, String msg, String time,
SlideView mSlideView) {
super();
this.iconRes = iconRes;
this.title = title;
this.msg = msg;
this.time = time;
this.mSlideView = mSlideView;
}
public void setmSlideView(SlideView mSlideView) {
this.mSlideView = mSlideView;
}
@Override
public String toString() {
return "MessageBean [iconRes=" + iconRes + ", title=" + title
+ ", msg=" + msg + ", time=" + time + ", mSlideView="
+ mSlideView + "]";
}
}
___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
package com.zm.view;
import com.zm.R;
import android.content.Context;
import android.graphics.drawable.GradientDrawable.Orientation;
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;
public class SlideView extends LinearLayout {
// private TextView delete;
private static final String TAG="SlideView";
/**上下文对象**/
private Context mContext;
/**显示內容**/
private LinearLayout mViewContent;
private RelativeLayout mViewHolder;
/**滚动**/
private Scroller mScroller;
private onSlideListener mOnSlideListener;
private int mHoldeWid=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_SCROLL=1;
/**开始滚动**/
public static final int SLIDE_STATUS_ON=2;
public void onSlide(View view, int status);
}
public SlideView(Context context) {
super(context);
initView();
}
public void shrink() {
if (getScrollX() != 0) {
this.smoothScrollTo(0, 0);
}
}
private void smoothScrollTo(int destX, int destY) {
// TODO Auto-generated method stub
//缓慢滚动指定位置
int scrollX=getScrollX();
int delta=destX=destY;
mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta)*3);
invalidate();
}
private void initView() {
//初始化操作
mContext=getContext();
/**初始化滚动实例**/
mScroller=new Scroller(mContext);
/**设置为水平方向**/
setOrientation(LinearLayout.HORIZONTAL);
View.inflate(mContext, R.layout.privatelisting_delete_merge, this);
mViewContent=(LinearLayout) findViewById(R.id.view_content);
mHoldeWid=Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mHoldeWid, getResources().getDisplayMetrics()));
}
public SlideView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initView();
}
public void setButtonText(CharSequence text) {
((TextView)findViewById(R.id.delete)).setText(text);
}
public void setContentView(View v){
mViewContent.addView(v);
}
@Override
public void computeScroll() {
if(mScroller.computeScrollOffset()){
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
super.computeScroll();
}
public void setOnSlideListener(onSlideListener onSlideListener){
mOnSlideListener=onSlideListener;
}
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_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 >mHoldeWid) {
newScrollX = mHoldeWid;
}
this.scrollTo(newScrollX, 0);
}
break;
}
case MotionEvent.ACTION_UP: {
int newScrollX = 0;
if (scrollX - mHoldeWid * 0.75 > 0) {
newScrollX = mHoldeWid;
}
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;
}
}
___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
package com.zm.view;
import com.zm.bean.MessageBean;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ListView;
public class SlideListView extends ListView {
private static final String TAG="SlideListView";
private SlideView mSlideView;
public SlideListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public SlideListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public SlideListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
}
public void shrinkListItem(int position){
View view=getChildAt(position);
if(view!=null){
try {
((SlideView) view).shrink();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
switch (ev.getAction()) {
/**手指按下**/
case MotionEvent.ACTION_DOWN:
int x=(int) ev.getX();
int y=(int) ev.getY();
int pos=pointToPosition(x, y);
Log.i(TAG, "pos="+pos);
if(pos!=INVALID_POSITION){
MessageBean msg=(MessageBean) getItemAtPosition(pos);
mSlideView=msg.mSlideView;
Log.i(TAG, "mSlideView="+mSlideView);
break;
}
default:
break;
}
if(mSlideView!=null){
mSlideView.onRequireTouchEvent(ev);
}
return super.onTouchEvent(ev);
}
}
到这里步骤基本结束了!有兴趣的童鞋欢迎加入此群进行交流!
喜欢的加群!
转载请注明出处!http://blog.csdn.net/qq_15950325/article/details/52752904谢谢合作!
源码(http://download.csdn.net/detail/qq_15950325/9647117“)