今天帶來一篇實現QQ側滑刪除以及下拉刷新上拉加載的博客,前段時間在個人項目當中有個模塊就是實現相似於qq側滑上來刷新的效果,剛開始沒啥思路,後來看到了一個用的比較廣泛的一個開源控件,Swipelayout來實現側滑刪除,本是想經過XListView來實現下拉刷新上啦加載的,可是XListView控件還有一些問題比較突出,好比當咱們的列表數據沒有充滿這個屏幕時,此時若是咱們觸發上啦刷新這個動做,會致使FooterView的高度增長,影響用戶體驗,甚至你在短期內進行屢次上啦刷新的動做,會致使數據重複加載,因此我使用PulToRefreshListView(固然你也能夠用RecyClerView來代替),首先咱們看一張實現的效果圖,畢竟眼見爲實嗎,待會再上代碼。java
(應該錄個動態圖的,這樣效果更好點,講究點看圖片不太整齊,看代碼就行。。。)android
要想實現這個功能,首先你的去下載這個控件的相關源碼,把引入到本身的項目當中便可,這個功能最主要的代碼在器Adapter中,至於添加數據等這些操做,我就不貼代碼展現了,下面咱們來看看如何實現這個功能。app
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(); } @Override public int getSwipeLayoutResourceId(int position) { return R.id.swipe; } @Override public 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() { @Override public void onOpen(SwipeLayout layout) { Toast.makeText(mContent, "Open", Toast.LENGTH_SHORT).show(); } }); // 雙擊的回調函數 swipeLayout .setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() { @Override public void onDoubleClick(SwipeLayout layout, boolean surface) { Toast.makeText(mContent, "DoubleClick", Toast.LENGTH_SHORT).show(); } }); // 添加刪除佈局的點擊事件 messageView.findViewById(R.id.ll_menu).setOnClickListener(new View.OnClickListener() { @Override public 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; } @Override public 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); } @Override public int getCount() { Log.i("MessageActivity", listModels.size() + "=======listModels"); return listModels.size(); } @Override public Object getItem(int position) { return listModels.get(position); } @Override public 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() { @Override public void onClick(DialogInterface dialog, int which) { listModels.remove(position); notifyDataSetChanged(); // 點擊完成以後,關閉刪除menu swipeLayout.close(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public 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; } }
一、首先咱們的Adapter要繼承BaseSwipeAdapter,來重寫他提供的方法,好比ide
public int getSwipeLayoutResourceId(int position) { return R.id.swipe; }
必定返回R.id.swipe,否則找不到你當前的Item資源
二、messageView = mInflater.inflate(R.layout.activity_message_item,parent,false);
在這裏並不須要對messageView作null判斷
三、Item中的控件或者佈局必定要用
<com.info.mettingapp.weight.SwipeLayout
android:id="@+id/swipe"
android:layout_width="match_parent"
android:layout_height="match_parent" >
作外層包裝。四、Item的刪除就是根據當前的位置來從集合當中移除,而後通知ListView發生改變以上就是對SwipeLayout的使用上面所需注意的地方,下次咱們一塊兒看看側滑實現的原理,這樣你就更好理解,這篇博客就不在講解側滑原理(下片整理)