Android-RecyclerView側(cè)滑刪除和拖拽操作,最底部條目不參與操作+上拉加載更多實(shí)現(xiàn)

===滑動(dòng)拖拽===

Look, ItemTouchHelper | Android Developers

ItemTouchHelper
public class ItemTouchHelper 
extends RecyclerView.ItemDecoration implements RecyclerView.OnChildAttachStateChangeListener

java.lang.Object
   ?    android.support.v7.widget.RecyclerView.ItemDecoration
       ?    android.support.v7.widget.helper.ItemTouchHelper

This is a utility class to add swipe to dismiss and drag & drop support to RecyclerView.

It works with a RecyclerView and a Callback class, which configures what type of interactions are enabled and also receives events when user performs these actions.

Depending on which functionality you support, you should override onMove(RecyclerView, ViewHolder, ViewHolder) and / or onSwiped(ViewHolder, int).

This class is designed to work with any LayoutManager but for certain situations, it can be optimized for your custom LayoutManager by extending methods in the ItemTouchHelper.Callback class or implementing ItemTouchHelper.ViewDropHandler interface in your LayoutManager.

By default, ItemTouchHelper moves the items' translateX/Y properties to reposition them. You can customize these behaviors by overriding onChildDraw(Canvas, RecyclerView, ViewHolder, float, float, int, boolean) or onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int, boolean).

Most of the time you only need to override onChildDraw.

解釋:就是說這是一個(gè)支持RecyclerView的滑動(dòng)刪除和拖拽的實(shí)體類。

它靠一個(gè)回調(diào)來實(shí)現(xiàn),也就是ItemTouchHelper.Callback | Android Developers

基于這個(gè)支持,你還需要實(shí)現(xiàn)[onMove(RecyclerView, ViewHolder, ViewHolder)](https://link.zhihu.com/?target=https%3A//developer.android.google.cn/reference/android/support/v7/widget/helper/ItemTouchHelper.Callback.html%3Fhl%3Dzh-cn%23onMove%28android.support.v7.widget.RecyclerView%2C%2520android.support.v7.widget.RecyclerView.ViewHolder%2C%2520android.support.v7.widget.RecyclerView.ViewHolder%29)and / or[onSwiped(ViewHolder, int)](https://link.zhihu.com/?target=https%3A//developer.android.google.cn/reference/android/support/v7/widget/helper/ItemTouchHelper.Callback.html%3Fhl%3Dzh-cn%23onSwiped%28android.support.v7.widget.RecyclerView.ViewHolder%2C%2520int%29) 方法。

這個(gè)類還支持特定解決方案的所有LayoutManager,但是需要你繼承ItemTouchHelper.Callback或者實(shí)現(xiàn)ItemTouchHelper.ViewDropHandler 接口。

另外你通過重寫onChildDraw 方法可以實(shí)現(xiàn)移動(dòng)屬性的自定義。

1. 所以創(chuàng)建一個(gè)這樣的實(shí)體對象就是像這樣:

    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
            @Override
            public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
                return 0;
            }

            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {

            }
        }); 

2. 調(diào)用就是如下的方法咯, attach一下RecyclerView就可以啦...

  void  attachToRecyclerView(RecyclerView recyclerView)
Attaches the ItemTouchHelper to the provided RecyclerView.

還有其他方法如下,先不管嘛,慢慢來

image

Look2, 所以重點(diǎn)來了,就是這個(gè) ItemTouchHelper.Callback | Android Developers 如果不想自定義,其實(shí)有個(gè)官方簡單版ItemTouchHelper.SimpleCallback | Android Developers<u style="text-decoration: none; border-bottom: 1px dashed grey;"> 這個(gè)可能就不能針對某個(gè)條目單獨(dú)處理了咯....</u>

不過人家已經(jīng)把移動(dòng)操作弄好了。另外滑動(dòng)效果也處理了,你只需要將滑動(dòng)的條目從adapter中刪除即可!參數(shù)就是滑動(dòng)的方向和拖拽的方法處理(比如只能向上拖動(dòng),左滑右滑啥的),如下:

     ItemTouchHelper itemTouchHelper2 = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,
                ItemTouchHelper.LEFT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
                return true;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
                // remove from adapter
            }
        });

Then,如果我們希望列表類似如下:(底部的條目不能被滑動(dòng)刪除,也不能被移動(dòng),同時(shí)也不能被拖動(dòng)的條目改變位置...)

image

1. 這個(gè)時(shí)候就需要我們自定義ItemTouchHelper.Callback | Android Developers

然后重點(diǎn)重寫如下三個(gè)方法,基本上就可以進(jìn)行相關(guān)控制了。當(dāng)然有些也可以簡單重寫,比如isLongPressDragEnabled()這些,可以控制狀態(tài)。

 abstract int   getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder)

  abstract boolean  onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
Called when ItemTouchHelper wants to move the dragged item from its old position to the new position.

abstract void   onSwiped(RecyclerView.ViewHolder viewHolder, int direction)
Called when a ViewHolder is swiped by the user.

2. 我們?yōu)榱丝刂谱詈蟮臈l目不能操作的情況,我們重點(diǎn)關(guān)注下getMovementFlags方法

getMovementFlags
added in version 24.1.0
int getMovementFlags (RecyclerView recyclerView, 
                RecyclerView.ViewHolder viewHolder)
Should return a composite flag which defines the enabled move directions in each state (idle, swiping, dragging).

Instead of composing this flag manually, you can use makeMovementFlags(int, int) or makeFlag(int, int).

This flag is composed of 3 sets of 8 bits, where first 8 bits are for IDLE state, next 8 bits are for SWIPE state and third 8 bits are for DRAG state. Each 8 bit sections can be constructed by simply OR'ing direction flags defined in ItemTouchHelper.

For example, if you want it to allow swiping LEFT and RIGHT but only allow starting to swipe by swiping RIGHT, you can return:

      makeFlag(ACTION_STATE_IDLE, RIGHT) | makeFlag(ACTION_STATE_SWIPE, LEFT | RIGHT);

This means, allow right movement while IDLE and allow right and left movement while swiping.

這個(gè)屬性返回值就意味著你對該條目的操作狀態(tài),比如我們獲取當(dāng)前位置是最后一個(gè)條目,進(jìn)行如下處理:(mList.size()需要你外部傳入鏈表mList喲)

  @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        //int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        //int swipeFlags = ItemTouchHelper.LEFT;
        int[] flags;
        if (viewHolder.getLayoutPosition() == (mList.size() - 1)){
            flags =  new int[]{0, 0};
        }else{
            flags =  new int[]{ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT};
        }
        return makeMovementFlags(flags[0], flags[1]);
    }         

也就是說不管是滑動(dòng)還是拖拽,只要是最后一個(gè)條目,那么標(biāo)志都為0,也就是什么都不能干!其他情況,正常左滑,拖拽即可!

當(dāng)然其實(shí)我們可以搞一個(gè)回調(diào)來返回想要的處理,如果說很多頁面都是同樣的操作,倒是可以再次封裝一下,最后我們貼上我的自定義:

SimpleItemTouchHelperCallback.java

import android.graphics.Canvas;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;

/*
 *@Description: 側(cè)滑刪除輔助類
 *@Author: hl
 *@Time: 2019/1/4 15:52
 */
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {
    private Sthc_Movement sthc_movement;

    public SimpleItemTouchHelperCallback(Sthc_Movement sthc_movement){
        this.sthc_movement = sthc_movement;
    }

    /**
     * 控制每個(gè)條目的可操作狀態(tài) - 滑動(dòng),拖拽等  來源->getFlag
     * @param recyclerView
     * @param viewHolder
     * @return
     */
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        //int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        //int swipeFlags = ItemTouchHelper.LEFT;
        int[] flags = sthc_movement.getFlag(viewHolder.getLayoutPosition());
        return makeMovementFlags(flags[0], flags[1]);
    }

    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        sthc_movement.onMove(viewHolder, target);
        return true;
    }

    @Override
    public boolean isLongPressDragEnabled() {
        return true;
    }

    @Override
    public boolean isItemViewSwipeEnabled() {
        return true;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
        sthc_movement.onSwiped(viewHolder, i);
    }

    @Override
    public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
                            float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
        if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
            final float alpha = 1 - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
            viewHolder.itemView.setAlpha(alpha);
            viewHolder.itemView.setTranslationX(dX);
        }
    }

    public interface Sthc_Movement{
        public void onMove(RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target);
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction);
        public int[] getFlag(int postion);
    }
}

LookEnd,具體使用如下(注意移動(dòng)條目交換的操作就行)

    ///< 側(cè)滑刪除和拖拽排序
        SimpleItemTouchHelper itemTouchHelper = new SimpleItemTouchHelper(new SimpleItemTouchHelperCallback(new SimpleItemTouchHelperCallback.Sthc_Movement() {
            @Override
            public void onMove(RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                int fromPosition = viewHolder.getAdapterPosition();
                int toPosition = target.getAdapterPosition();
                ///< 禁止拖動(dòng)到新增菜單的底部
                if (toPosition >= (mList.size() - 1)){
                    return;
                }
                if (fromPosition < toPosition) {
                    for (int i = fromPosition; i < toPosition; i++) {
                        Collections.swap(mList, i, i + 1);
                    }
                } else {
                    for (int i = fromPosition; i > toPosition; i--) {
                        Collections.swap(mList, i, i - 1);
                    }
                }
                baseAdapter.notifyItemMoved(fromPosition, toPosition);
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                int position = viewHolder.getAdapterPosition();
                mList.remove(position);
                baseAdapter.notifyItemRemoved(position);
            }

            /**
             * 控制每個(gè)條目的可操作狀態(tài) - 滑動(dòng),拖拽等  對應(yīng)->getMovementFlags
             * @param position
             * @return
             */
            @Override
            public int[] getFlag(int position) {
                if (position == (mList.size() - 1)){
                    return new int[]{0, 0};
                }else{
                    return new int[]{ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT};
                }
            }
        }));
        itemTouchHelper.attachToRecyclerView(dailyItemsRv);

其中注意不允許其他條目在底部菜單下面,所以我增加了如下判斷:

image

基本上簡單需求是滿足了。對了,1. onChildDrawif (actionState == ItemTouchHelper.ACTION_STATE_SWIPE**) 的處理,是滑動(dòng)過程alpha透明度的變化?;瑒?dòng)慢點(diǎn)可以看到效果。。。

2. SimpleItemTouchHelper沒什么東東,就簡單繼承了下ItemTouchHelper | Android Developers 后面或許還可以增加額外自定義處理。

這個(gè)先簡單這樣認(rèn)識下,畢竟小萌新都沒接觸過,有時(shí)候就是需要項(xiàng)目多實(shí)戰(zhàn)。把常用的都搞搞,然后深入,然后源碼剖析,這樣應(yīng)該才能掌握的更好!

===上拉加載更多===

說起這個(gè),一般小萌新都是搬磚的,只會(huì)用人家的框架 - 下拉刷新,上拉加載更多!我們來看看官方的下拉刷新SwipeRefreshLayout | Android Developers 這個(gè)簡單入門使用還好,先不搞特別復(fù)雜的效果:

        // 設(shè)置顏色屬性的時(shí)候一定要注意是引用了資源文件還是直接設(shè)置16進(jìn)制的顏色,因?yàn)槎际莍nt值容易搞混
        // 設(shè)置下拉進(jìn)度的背景顏色,默認(rèn)就是白色的
        dailyHisItemsSwr.setProgressBackgroundColorSchemeResource(android.R.color.white);
        // 設(shè)置下拉進(jìn)度的主題顏色
        dailyHisItemsSwr.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark);
        // 下拉時(shí)觸發(fā)SwipeRefreshLayout的下拉動(dòng)畫,動(dòng)畫完畢之后就會(huì)回調(diào)這個(gè)方法
        dailyHisItemsSwr.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                // 開始刷新,設(shè)置當(dāng)前為刷新狀態(tài)
                //swipeRefreshLayout.setRefreshing(true);
                //                if (startload){
                //                    return;
                //                }

                // 模擬下: 
                //  這里是主線程
                // 一些比較耗時(shí)的操作,比如聯(lián)網(wǎng)獲取數(shù)據(jù),需要放到子線程去執(zhí)行
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //  加載數(shù)據(jù)
                        //  刷新數(shù)據(jù) baseAdapter.notifyDataSetChanged();
                        //  加載完數(shù)據(jù)設(shè)置為不刷新狀態(tài),將下拉進(jìn)度收起來
                        dailyHisItemsSwr.setRefreshing(false);
                    }
                }, 500);

                // 這個(gè)不能寫在外邊,不然會(huì)直接收起來
                //swipeRefreshLayout.setRefreshing(false);
            }
        });

基本就能看到下拉刷新的效果啦....

然后接著我們快速入門下上拉加載更多吧,這個(gè)有點(diǎn)點(diǎn)麻煩,另外如果SwipeRefreshLayout + RecyclerView實(shí)現(xiàn)下拉刷新/上拉加載更多 - 可能還會(huì)遇到很多問題需要處理(比如下拉時(shí)禁止上拉,上拉加載過程中禁止下拉刷新,還有就是上拉加載觸發(fā)的條件-當(dāng)前如果沒有數(shù)據(jù),可能就不能上拉加載了,可能就是全屏顯示無數(shù)據(jù),點(diǎn)擊刷新獲取了, 總之要實(shí)現(xiàn)一個(gè)效果體驗(yàn)好的上拉加載/下拉刷新框架不是這么容易的)。 從目前小萌新的感覺來看,實(shí)現(xiàn)上拉加載更多動(dòng)畫,上拉停止動(dòng)畫,回彈,這個(gè)過程是需要監(jiān)聽持續(xù)touch事件的,也就是說單純的靠監(jiān)聽RecyclerView的addOnScrollListener貌似不太行,必須有持續(xù)監(jiān)聽。 后面要專門搞搞這個(gè)上拉加載更多的效果....

說這么多,開始吧...**上拉加載更多。 **目前的方案基本都是監(jiān)聽RecyclerView的滾動(dòng),然后判斷是上拉加載更多的話,則Adapter底部條目對應(yīng)顯示加載更多,以及還可以擴(kuò)展“沒有更多了”等效果。

1. 先看下Adapter的擴(kuò)展處理吧 - 看關(guān)鍵點(diǎn)就可以了!每個(gè)人的適配器不同!

1.1 首先就是如果是需要展示底部加載狀態(tài)的情況下,返回的item個(gè)數(shù)多一個(gè)

image

1.2 然后就是getItemViewType返回不同的類型

image

1.3 接著就是布局加載以及數(shù)據(jù)綁定,小萌新是分別搞了多個(gè)不同狀態(tài)的布局。綁定數(shù)據(jù)的時(shí)候就處理正常條目數(shù)據(jù)即可,加載狀態(tài)的布局不做綁定操作?。?/p>

image

1.4 額外提供一些數(shù)據(jù)刷新以及狀態(tài)判斷的方法

/**
     * 添加更多數(shù)據(jù)
     * @param _baseMulDataModelList
     */
    public void addMoreItem(List<BaseDataModel> _baseMulDataModelList) {
        state = STATE.HIDE;
        baseMulDataModelList.addAll(_baseMulDataModelList);
        notifyDataSetChanged();
    }

    /**
     * 開始加載
     */
    public void startLoad() {
        state = STATE.START_LOAD;
        notifyDataSetChanged();
    }

    /**
     * 加載中
     */
    public void startLoading() {
        state = STATE.LOADING;
        notifyDataSetChanged();
    }

    /**
     * 加載結(jié)束,無更多數(shù)據(jù)了
     */
    public void finishNoMoreData() {
        state = STATE.NO_MOREDATA;
        notifyDataSetChanged();
    }

    /**
     * 是否開始加載了
     * @return
     */
    public boolean bIsStart(){
        return state == STATE.START_LOAD;
    }

    /**
     * 是否正在加載
     * @return
     */
    public boolean bIsLoading(){
        return state == STATE.LOADING || state == STATE.NO_MOREDATA;
    }

    public boolean bJustLoading(){
        return state == STATE.LOADING;
    }

2. 以上就基本構(gòu)建好了。接下來就是我們適配器創(chuàng)建RecyclerView.OnScrollListener | Android Developers ,上拉加載處理了...

2.1 你網(wǎng)上搜有些“SwipeRefreshLayout和RecyclerView實(shí)現(xiàn)下拉刷新上拉加載更多”,基本方案都類似。就是細(xì)節(jié)處理不太一樣。有些是在onScrollStateChanged中請求上拉加載,有些是在onScrolled處理上拉加載,大部分還是在onScrollStateChanged中進(jìn)行了處理。

2.2 需要注意, 如果你的條目不滿一屏的話,上拉加載不會(huì)觸發(fā)onScrolled回調(diào),所以你要注意在onScrolled處理的地方喲!

按小萌新想法,這種情況可以不用觸發(fā)上拉加載更多,本來就那么多數(shù)據(jù),正常的邏輯!哈哈。。。

2.3 所以小萌新的總結(jié)是:onScrolled中進(jìn)行判斷是否上拉加載更多,并且滿足條件,開啟加載;然后當(dāng)滑動(dòng)停止時(shí), 在onScrollStateChanged中進(jìn)行數(shù)據(jù)加載(需要判斷是否開啟了加載,這樣可以避免不滿一屏也上拉的操作;同時(shí)還要判斷是否正在下拉刷新這些情況....)

看下兩個(gè)方法和一些屬性介紹...

onScrollStateChanged
added in version 22.1.0
void onScrollStateChanged (RecyclerView recyclerView, 
                int newState)
Callback method to be invoked when RecyclerView's scroll state changes.

Parameters
recyclerView    RecyclerView: The RecyclerView whose scroll state has changed.
newState    int: The updated scroll state. One of SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING or SCROLL_STATE_SETTLING.

onScrolled
added in version 22.1.0
void onScrolled (RecyclerView recyclerView, 
                int dx, 
                int dy)
Callback method to be invoked when the RecyclerView has been scrolled. This will be called after the scroll has completed.

This callback will also be called if visible item range changes after a layout calculation. In that case, dx and dy will be 0.

Parameters
recyclerView    RecyclerView: The RecyclerView which scrolled.
dx  int: The amount of horizontal scroll.
dy  int: The amount of vertical scroll.

dy可以用來判斷是下滑還是上滑的,目前按照我的邏輯,暫時(shí)不需要這個(gè)處理,我只需要判斷上拉加載更多時(shí),是否達(dá)到了底部?- 靠獲取底部條目的bottom位置,然后跟RecyclerView做差值,小于10基本就是了。此時(shí)就可以開始加載...

   /**初始化界面***/
   private void initView(){
        ///< 上拉加載更多監(jiān)聽
        adh_dailyHisItemsRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                Log.e("test", "newState=" + newState);

                ///< 正在刷新,則直接返回
                if (dailyHisItemsSwr.isRefreshing() || baseAdapter.bIsLoading()) return;

                ///< 加載更多 onScrolled中上拉加載條件滿足時(shí)進(jìn)行加載更多的操作??其他優(yōu)化?
                if (baseAdapter.bIsStart() &&
                        !baseAdapter.bIsLoading() &&
                        newState == RecyclerView.SCROLL_STATE_IDLE) {
                    baseAdapter.startLoading();
                    loadMoreDate();
                }
                //Log.e("test", "startload=" + startload + " newState=" + newState);
            }

            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                //lastVisibleItem = layoutManager.findLastVisibleItemPosition();
                //bUpLoad = dy > 0;
                Log.e("test", "dy=" + dy);

                if (baseAdapter.bIsLoading()) return;

                View viewlast = layoutManager.findViewByPosition(baseAdapter.getItemCount() - 1);
                Log.e("test", "viewlast=" + viewlast);
                ///< 當(dāng)滑動(dòng)到底部item的時(shí)候(此時(shí)底部bottom基本就是高度),設(shè)置startload = true,展示加載中(可以修改為動(dòng)畫顯示)
                if (null != viewlast && (recyclerView.getHeight() - viewlast.getBottom()) < 10) {
                    //Log.e("test", "getHeight=" + recyclerView.getHeight());
                    //Log.e("test", "getTop=" + viewlast.getTop());
                    //Log.e("test", "getBottom=" + viewlast.getBottom());
                    baseAdapter.startLoad();
                }
            }
        });
   }      

   /**
     * 加載更多
     */
    private void loadMoreDate() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                List<BaseDataModel> mListTemp = new ArrayList<>();
                for (int i = 0; i < 20; i++) {
                    DailyHisAdapterItemBean dailyHisAdapterItemBean = new DailyHisAdapterItemBean();
                    dailyHisAdapterItemBean.setDate("2019.11.11");
                    dailyHisAdapterItemBean.setNames("殺豬刀一把/青椒炒蘋果/蘿卜抄西瓜/蘿卜抄西瓜");
                    dailyHisAdapterItemBean.setTotal_price(12.28);
                    dailyHisAdapterItemBean.setTotal_weight(0.5);
                    mListTemp.add(dailyHisAdapterItemBean);
                }
                baseAdapter.addMoreItem(mListTemp);
                baseAdapter.finishNoMoreData();
            }
        }, 2000);
    }

基本就ojbk了。。。

image
image

總之,小萌新又接觸了一些知識。這塊后面要加強(qiáng),是需要看下第三方框架源碼,然后學(xué)習(xí)下。 雖然不用總是造輪子,但是還是知道多點(diǎn)比較好吧....

心情好,放松,開心的學(xué)習(xí)就好 - 小萌新

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容