仿QQ側滑刪除以及下拉刷新上啦加載?


      今天帶來一篇實現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();
    }

    @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;
    }
}

   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的使用上面所需注意的地方,下次我們一起看看側滑實現的原理,這樣你就更好理解,這篇博客就不在講解側滑原理(下片整理)









免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM