今天带来一篇实现QQ侧滑删除以及下拉刷新上拉加载的博客,前段时间在我的项目当中有个模块就是实现类似于qq侧滑上来刷新的效果,刚开始没啥思路,后来看到了一个用的比较普遍的一个开源控件,Swipelayout来实现侧滑删除,本是想通过XListView来实现下拉刷新上啦加载的,但是XListView控件还有一些问题比较突出,比如当我们的列表数据没有充满这个屏幕时,此时如果我们触发上啦刷新这个动作,会导致FooterView的高度增加,影响用户体验,甚至你在短时间内进行多次上啦刷新的动作,会导致数据重复加载,所以我使用PulToRefreshListView(当然你也可以用RecyClerView来代替),首先我们看一张实现的效果图,毕竟眼见为实吗,待会再上代码。
(应该录个动态图的,这样效果更好点,讲究点看图片不太整齐,看代码就行。。。)
要想实现这个功能,首先你的去下载这个控件的相关源码,把引入到自己的项目当中即可,这个功能最主要的代码在器Adapter中,至于添加数据等这些操作,我就不贴代码展示了,下面我们来看看如何实现这个功能。
package com.info.mettingapp.adapter; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast;import com.info.mettingapp.R; import com.info.mettingapp.model.MessageCenterModel; import com.info.mettingapp.weight.CustomExitDialog; import com.info.mettingapp.weight.SimpleSwipeListener; import com.info.mettingapp.weight.SwipeLayout; import java.util.List;/**** Created by joe.xiang on 2016/3/8.*/ public class SwipeMessageAdapter extends BaseSwipeAdapter {/** 定义变量*/private Context mContent;private LayoutInflater mInflater;private List<MessageCenterModel> listModels;private View messageView = null;/** 初始化变量*/public SwipeMessageAdapter(Context context){this.mContent = context;mInflater = LayoutInflater.from(mContent);}/*** 数据源* @param lists*/public void setMessageDate(List<MessageCenterModel> lists){this.listModels = lists;notifyDataSetChanged();}@Overridepublic int getSwipeLayoutResourceId(int position) {return R.id.swipe;}@Overridepublic View generateView(final int position, ViewGroup parent) {messageView = mInflater.inflate(R.layout.activity_message_item,parent,false);final SwipeLayout swipeLayout = (SwipeLayout) messageView.findViewById(getSwipeLayoutResourceId(position));// 当隐藏的删除menu被打开的时候的回调函数swipeLayout.addSwipeListener(new SimpleSwipeListener() {@Overridepublic void onOpen(SwipeLayout layout) {Toast.makeText(mContent, "Open", Toast.LENGTH_SHORT).show();}});// 双击的回调函数 swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {@Overridepublic void onDoubleClick(SwipeLayout layout,boolean surface) {Toast.makeText(mContent, "DoubleClick",Toast.LENGTH_SHORT).show();}});// 添加删除布局的点击事件messageView.findViewById(R.id.ll_menu).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {Toast.makeText(mContent, "delete", Toast.LENGTH_SHORT).show();CustomExitDialog dialog = new CustomExitDialog(mContent,R.style.customExitDailogStyle,R.layout.custom_exit_dialog,SwipeMessageAdapter.this,listModels,position,swipeLayout);dialog.show();}});return messageView;}@Overridepublic void fillValues(int position, View convertView) {MessageHolder holder = null;if(convertView!=null){holder = new MessageHolder();holder.messageView = (ImageView)convertView.findViewById(R.id.message_image);holder.messageTitle = (TextView)convertView.findViewById(R.id.mesage_tixing);holder.messageContent = (TextView)convertView.findViewById(R.id.mesage_content);holder.messageDate = (TextView)convertView.findViewById(R.id.mesage_date);}holder.messageView.setImageResource(listModels.get(position).messageImage);holder.messageTitle.setText(listModels.get(position).messageTitle);holder.messageContent.setText(listModels.get(position).messageContent);holder.messageDate.setText(listModels.get(position).messsageDate);}@Overridepublic int getCount() {Log.i("MessageActivity", listModels.size() + "=======listModels");return listModels.size();}@Overridepublic Object getItem(int position) {return listModels.get(position);}@Overridepublic long getItemId(int position) {return position;}public void CreateDialog(final SwipeLayout swipeLayout,final int position){AlertDialog.Builder builder = new AlertDialog.Builder(mContent);builder.setMessage("确认删除这条信息");builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {listModels.remove(position);notifyDataSetChanged();// 点击完成之后,关闭删除menu swipeLayout.close();}});builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();// 点击完成之后,关闭删除menu swipeLayout.close();}});builder.create().show();}public static class MessageHolder {ImageView messageView;TextView messageTitle;TextView messageContent;TextView messageDate;} }
1、首先我们的Adapter要继承BaseSwipeAdapter,来重写他提供的方法,比如
public int getSwipeLayoutResourceId(int position) {return R.id.swipe;}
一定返回R.id.swipe,不然找不到你当前的Item资源
2、messageView = mInflater.inflate(R.layout.activity_message_item,parent,false);
在这里并不需要对messageView做null判断
3、Item中的控件或者布局一定要用
<com.info.mettingapp.weight.SwipeLayout
android:id="@+id/swipe"
android:layout_width="match_parent"
android:layout_height="match_parent" >
做外层包装。
4、Item的删除就是根据当前的位置来从集合当中移除,然后通知ListView发生改变
以上就是对SwipeLayout的使用上面所需注意的地方,下次我们一起看看侧滑实现的原理,这样你就更好理解,这篇博客就不在讲解侧滑原理(下片整理)