【问题标题】:Pull SwipeRefreshLayout to refresh RecyclerView In Fragment in android but Not Working拉 SwipeRefreshLayout 以在 android 的 Fragment 中刷新 RecyclerView 但不工作
【发布时间】:2018-09-24 13:22:12
【问题描述】:

如何通过 SwipeRefreshLayout 刷新 RecyclerView?我在谷歌上搜索了很多,但它不起作用。这是我的代码片段 我通过 Jason Parsing 从服务器获取数据并进入数组并将数组设置到我的 RecyclerView 适配器中。数据显示正常,但 SwipeRefreshLayout 不起作用。

public class FirstFragment extends Fragment{
   public  RecyclerView recyclerView;
   public  SwipeRefreshLayout mswipeRefreshLayout;
  public static MyRecyclerAdapter searchAdapter;
    private static final String TAG = "FirstFragment";
    MyRecyclerAdapter myRecyclerAdapter;
    ArrayList<DataStored>dataStoredArrayList;
    private ParseDataClass mparser;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        View view=inflater.inflate(R.layout.first_fragment,null);
        recyclerView=(RecyclerView)view.findViewById(R.id.mFirstRecyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));
        mswipeRefreshLayout = (SwipeRefreshLayout)view.findViewById(R.id.swipelayoutm);
        mparser = new ParseDataClass(getActivity());
        mparser.setOnDataRetrievalCallback(new OnDataRetrievalCallback() {
            @Override
            public void onDataRetrieval(ArrayList<DataStored> dataSet) {
                dataStoredArrayList=dataSet;
                myRecyclerAdapter=new MyRecyclerAdapter(getActivity(),dataStoredArrayList,mswipeRefreshLayout);
                searchAdapter =myRecyclerAdapter;
                recyclerView.setAdapter(myRecyclerAdapter);
            }
        });
        mparser.execute("http://192.168.3.10/fetchtext.php", "1");
         recyclerView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
            @Override
            public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                if (scrollX == 0) {
                    mswipeRefreshLayout.setEnabled(true);
                } else mswipeRefreshLayout.setEnabled(false);

            }
        });
        mswipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                Refreshlist();
                mswipeRefreshLayout.setRefreshing(false);
            }
        });

        return view;
    }

    private void Refreshlist() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                dataStoredArrayList.clear();
                myRecyclerAdapter.notifyDataSetChanged();
                mparser = new ParseDataClass(getActivity());
                mparser.setOnDataRetrievalCallback(new OnDataRetrievalCallback() {
                    @Override
                    public void onDataRetrieval(ArrayList<DataStored> dataSet) {
                        dataStoredArrayList.addAll(dataSet);
                        myRecyclerAdapter.notifyDataSetChanged();
                    }
                });
                mparser.execute("http://192.168.3.10/fetchtext.php", "1");

            }
        }, 0);
    }


}

【问题讨论】:

  • 设置 mswipeRefreshLayout.setRefreshing(false);紧接在 myRecyclerAdapter.notifyDataSetChanged();
  • 我已经这样做了,但没有工作我认为我遵循的这种方法是错误的。
  • 请查看所有片段代码
  • RefreshList 函数在这里不起作用是 RefreshList 函数中的问题
  • 您是故意添加延迟吗? 3秒?为什么你要再次添加回调?刷新列表中的 mparser.setOnDataRetrievalCallback。

标签: android android-fragments android-recyclerview pull-to-refresh


【解决方案1】:

您在获取语法后立即调用mswipeRefreshLayout.setRefreshing(false);,而当响应到来时它应该在回调块中。 我还在您的片段类中发现了一些会导致视图不一致的问题。

就像你设置了两次adatper,你设置了两次回调。

这里是优化的片段类

public class FirstFragment extends Fragment {
    public RecyclerView recyclerView;
    public SwipeRefreshLayout mswipeRefreshLayout;
    public static MyRecyclerAdapter searchAdapter;
    private static final String TAG = "FirstFragment";
    MyRecyclerAdapter myRecyclerAdapter;
    ArrayList<DataStored> dataStoredArrayList = new ArrayList<>();
    private ParseDataClass mparser;


    private void initView() {
        recyclerView = (RecyclerView) fragment_view.findViewById(R.id.mFirstRecyclerview);
        mswipeRefreshLayout = (SwipeRefreshLayout) fragment_view.findViewById(R.id.swipelayoutm);
        mswipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                refreshList();
            }
        });
    }

    private void setAdapter() {
        recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));
        myRecyclerAdapter = new AdapterOrders(getActivity(), dataStoredArrayList);
        recyclerView.setAdapter(myRecyclerAdapter);
        searchAdapter = myRecyclerAdapter;
    }

    private void setParser() {
        mparser = new ParseDataClass(getActivity());
        mparser.setOnDataRetrievalCallback(new OnDataRetrievalCallback() {
            @Override
            public void onDataRetrieval(ArrayList<DataStored> dataSet) {
                mswipeRefreshLayout.setRefreshing(false);
                if (dataSet != null)
                    dataStoredArrayList = dataSet;
                myRecyclerAdapter.notifyDataSetChanged();
            }
        });
    }

    private void refreshList() {
        mswipeRefreshLayout.setRefreshing(true);
        setParser();
        mparser.execute("http://192.168.3.10/fetchtext.php", "1");
    }

    View fragment_view;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        fragment_view = inflater.inflate(R.layout.first_fragment, null);
        initView();
        setAdapter();
        setParser();
        refreshList();
        return fragment_view;
    }
}

【讨论】:

  • 我怎样才能避免调用两次adatper和回调你能帮我编辑代码吗?
  • 我正在调用回调以获取刷新数组并再次调用适配器以将刷新数组设置为适配器是否有其他最好的方法请指导我
  • 哥们,我说你把片段类的完整代码粘贴过来,我帮你编辑一下。
  • 为什么要在适配器中传递 swipeRefreshLayout。我从来不需要这样做,你为什么要设置 setOnScrollChangeListener?让我知道,以便我进行优化。
  • 我错误地将 swipeRefreshLayout 传递给了适配器
【解决方案2】:
mswipeRefreshLayout.setRefreshing(false); 

在你的监听器中调用它:

    mparser.setOnDataRetrievalCallback(new OnDataRetrievalCallback() {
                        @Override
                        public void onDataRetrieval(ArrayList<DataStored> dataSet) {
                            mswipeRefreshLayout.setRefreshing(false); 
                            dataStoredArrayList.addAll(dataSet);
                            myRecyclerAdapter.notifyDataSetChanged();
                        }
                    });

并从 onRefresh() 方法中删除 mswipeRefreshLayout.setRefreshing(false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多