SwipeRefreshLayout+RecyclerView沖突的幾種解決方案

場(chǎng)景1

一種是SwipeRefreshLayout+RecyclerView在同一個(gè)界面的,
可以通過(guò)重寫(xiě)swipe盒使、或者重寫(xiě)recycler控件捣作,來(lái)解決衣摩。
這也是比較容易的

  • 方案1:在監(jiān)聽(tīng)方法里判斷卜录,當(dāng)RecyclerView可見(jiàn)的item位于第一個(gè)的時(shí)候戈擒,使swipeRefresh獲取焦點(diǎn)
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener(){  
        @Override  
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {  
            int topRowVerticalPosition =  
                    (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop();  
            swipeRefreshLayout.setEnabled(topRowVerticalPosition >= 0);  
  
        }  
  
        @Override  
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {  
            super.onScrollStateChanged(recyclerView, newState);  
        }  
    }); 
  • 方案2: 重寫(xiě)RecyclerView,
public class FixedRecyclerView extends RecyclerView {
    public FixedRecyclerView(Context context) {
        super(context);
    }

    public FixedRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FixedRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean canScrollVertically(int direction) {
        // check if scrolling up
        if (direction < 1) {
            boolean original = super.canScrollVertically(direction);
            return !original && getChildAt(0) != null && getChildAt(0).getTop() < 0 || original;
        }
        return super.canScrollVertically(direction);

    }
}
  • 方案3: 重寫(xiě)swipeRefreshlayout
ublic class SwipeRefreshLayout extends android.support.v4.widget.SwipeRefreshLayout
  {
  public SwipeRefreshLayout(Context context)
    {
    super(context);
    }

  public SwipeRefreshLayout(Context context,AttributeSet attrs)
    {
    super(context,attrs);
    }

  @Override
  public boolean canChildScrollUp()
    {
    View target=getChildAt(0);
    if(target instanceof AbsListView)
      {
      final AbsListView absListView=(AbsListView)target;
      return absListView.getChildCount()>0
              &&(absListView.getFirstVisiblePosition()>0||absListView.getChildAt(0)
              .getTop()<absListView.getPaddingTop());
      }
    else
      return ViewCompat.canScrollVertically(target,-1);
    }
  }

場(chǎng)景2

還有一種是存在ViewPager的頁(yè)面艰毒,
比如像這種筐高,不單存在ViewPage,而且外層還加了一個(gè)滾動(dòng)視圖ScrollView丑瞧。
需求是柑土,當(dāng)item處于頂端,再刷新嗦篱。
也就是需要從Activity里監(jiān)聽(tīng)Fragment中item的狀態(tài)冰单。

  • 方案:
    Activity中定義方法來(lái)獲取Fragment滾動(dòng)距離
    /*通過(guò)Fragmenbt的滾動(dòng)距離回調(diào)
    * 注意:這里只能處理當(dāng)ScrollLayout完全隱藏后幌缝,F(xiàn)ragment的ScrollView才能開(kāi)始滾動(dòng)事件灸促,
    * 上滑的時(shí)候卻優(yōu)先執(zhí)行ScrollLayout的方法
     */
    public void getonScroll(int i) {
        srl.setEnabled(i<450)
    }

Fragment中回調(diào)
如果RecyclerView外層還有ScrollView,還要處理滑動(dòng)沖突
方法是給RecyclerView設(shè)置android:nestedScrollingEnabled="false"屬性涵卵,將滾動(dòng)事件交給父滾動(dòng)控件浴栽,并且在監(jiān)聽(tīng)的時(shí)候監(jiān)聽(tīng)scrollView的滾動(dòng)事件

        scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
            @Override
            public void onScrollChange(View view, int i, int i1, int i2, int i3) {
                Log.e("i======", "i:" + i + ",i1:" + i1 + ",i2:" + i2 + ",i3:" + i3);
                if (i1>300) {
                    activity.getonScroll(i1);
                }
            }
        });

或者監(jiān)聽(tīng)RecyclerView

        //這里獲取不到recycler的監(jiān)聽(tīng)事件,因?yàn)镾crollView沖突問(wèn)題轿偎,在布局將滾動(dòng)焦點(diǎn)交給了ScrollView處理
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

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

想看詳細(xì)源碼可以參考:https://github.com/wapchief/imitationLOL
是一個(gè)仿掌上英雄聯(lián)盟的練手項(xiàng)目典鸡,歡迎star。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坏晦,一起剝皮案震驚了整個(gè)濱河市萝玷,隨后出現(xiàn)的幾起案子嫁乘,更是在濱河造成了極大的恐慌,老刑警劉巖球碉,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜓斧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡睁冬,警方通過(guò)查閱死者的電腦和手機(jī)挎春,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)豆拨,“玉大人直奋,你說(shuō)我怎么就攤上這事∈┖蹋” “怎么了脚线?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)弥搞。 經(jīng)常有香客問(wèn)我殉挽,道長(zhǎng),這世上最難降的妖魔是什么拓巧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任斯碌,我火速辦了婚禮,結(jié)果婚禮上肛度,老公的妹妹穿的比我還像新娘傻唾。我一直安慰自己,他們只是感情好承耿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布冠骄。 她就那樣靜靜地躺著,像睡著了一般加袋。 火紅的嫁衣襯著肌膚如雪凛辣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天职烧,我揣著相機(jī)與錄音扁誓,去河邊找鬼。 笑死蚀之,一個(gè)胖子當(dāng)著我的面吹牛蝗敢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播足删,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寿谴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了失受?” 一聲冷哼從身側(cè)響起讶泰,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咏瑟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后痪署,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體响蕴,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年惠桃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浦夷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辜王,死狀恐怖劈狐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呐馆,我是刑警寧澤肥缔,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站汹来,受9級(jí)特大地震影響续膳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜收班,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一坟岔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摔桦,春花似錦社付、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至兄世,卻和暖如春啼辣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背御滩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工鸥拧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艾恼。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓住涉,卻偏偏與公主長(zhǎng)得像麸锉,于是被迫代替她去往敵國(guó)和親钠绍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,749評(píng)論 25 707
  • 簡(jiǎn)介: 提供一個(gè)讓有限的窗口變成一個(gè)大數(shù)據(jù)集的靈活視圖花沉。 術(shù)語(yǔ)表: Adapter:RecyclerView的子類(lèi)...
    酷泡泡閱讀 5,148評(píng)論 0 16
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程柳爽,因...
    小菜c閱讀 6,365評(píng)論 0 17
  • 不知為什么磷脯,我從來(lái)不懂得抨擊別人蛾找,也不知是從小養(yǎng)成的“優(yōu)良”習(xí)慣,亦或根本是與身俱來(lái)的性格“缺陷”赵誓。 一來(lái)打毛,我常常...
    Mrenter閱讀 483評(píng)論 1 4
  • 承諾孩子的事就要盡量做到,否則別輕易許諾俩功。老公早就許下周末帶孩子去踏青幻枉,周末卻因故食言。早上诡蜓,孩子高...
    蓋小伍呀閱讀 321評(píng)論 5 5