當(dāng)SwipeRefreshLayout內(nèi)嵌listview的時(shí)候,滑動(dòng)listview的時(shí)會(huì)啟動(dòng)swipeRefreshLayout的下拉刷新。我使用的解決辦法是設(shè)置listview的滑動(dòng)監(jiān)聽,重寫滑動(dòng)監(jiān)聽器,通過判斷l(xiāng)istview的第一可視item的index來判斷是否需要刷新,如果不需要就把swipeRefreshLayout設(shè)置成不可滑動(dòng),否則設(shè)置成可滑動(dòng)。我的listview放在了fragment里面,所以我用了最笨的方法,在fragment的構(gòu)造方法里把a(bǔ)ctivity的swipeRefreshLayout對(duì)象傳遞給了fragment:MyManageFragmentmanageFragment = new MyManageFragment(swipeRefreshLayout);transation.add(R.id.activity_mydevice_container, manageFragment);transation.commit();然后在fragment的onCreateView里面設(shè)置其listview的滑動(dòng)監(jiān)聽:listview.setOnScrollListener(new SwpipeListViewOnScrollListener(swipeRefreshLayout));然后重寫滑動(dòng)監(jiān)聽器,通過判斷l(xiāng)istview的第一個(gè)可視的item的位置來決定是下拉刷新還是下滑,判斷到是下滑的時(shí)候,通過設(shè)置傳入的swipeRefreshLayout對(duì)象使其不可用:swipeRefreshLayout.setEnabled(false);重寫監(jiān)聽器:/** * 由于Listview與下拉刷新的Scroll事件沖突, 使用這個(gè)ScrollListener可以避免Listview滑動(dòng)異常 */public class SwpipeListViewOnScrollListener implements AbsListView.OnScrollListener { PRivate SwipeRefreshLayout mSwipeView; private AbsListView.OnScrollListener mOnScrollListener; public SwpipeListViewOnScrollListener(SwipeRefreshLayout swipeView) { mSwipeView = swipeView; } public SwpipeListViewOnScrollListener(SwipeRefreshLayout swipeView, AbsListView.OnScrollListener onScrollListener) { mSwipeView = swipeView; mOnScrollListener = onScrollListener; } @Override public void onScrollStateChanged(AbsListView absListView, int i) { } @Override public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { View firstView = absListView.getChildAt(firstVisibleItem); // 當(dāng)firstVisibleItem是第0位。如果firstView==null說明列表為空,需要刷新;或者top==0說明已經(jīng)到達(dá)列表頂部, 也需要刷新 if (firstVisibleItem == 0 && (firstView == null || firstView.getTop() == 0)) { mSwipeView.setEnabled(true);//可刷新 } else { mSwipeView.setEnabled(false);//不能刷新,此時(shí)為滑動(dòng) } if (null != mOnScrollListener) { mOnScrollListener.onScroll(absListView, firstVisibleItem, visibleItemCount, totalItemCount); } }}PS: 一開始想在activity里獲取到frgment里面的listview對(duì)象,在activity里設(shè)置listview的滑動(dòng)監(jiān)聽器,但是沒有成功,對(duì)于fragment和activity的交互,理解還不是很夠。MyManageFragmentmanageFragment = new MyManageFragment();transation.add(R.id.activity_mydevice_container, manageFragment,"mymanage_fragment");transation.commit();getSupportFragmentManager().executePendingTransactions(); //1--------------MymanageFragment myManageFragment = (MymanageFragment) getSupportFragmentManager().findFragmentByTag("mymanage_fragment");if (myManageFragment != null) { ListView listView = (ListView) myManageFragment.getView().findViewById(R.id.listview_mymanage); listView.setOnScrollListener(new SwpipeListViewOnScrollListener(swipeRefreshLayout));} else { toast("myManageFragment is null");}其中 myManageFragment.getView()返回的是null,有待進(jìn)一步解決
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注