場(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。