繁体   English   中英

拉SwipeRefreshLayout刷新Android中的片段中的RecyclerView,但不起作用

[英]Pull SwipeRefreshLayout to refresh RecyclerView In Fragment in android but Not Working

如何通过SwipeRefreshLayout刷新RecyclerView? 我在Google上搜索了很多内容,但无法正常工作。 这是片段中的代码,我正在通过Jason解析从服务器获取数据,并进入数组并将数组设置到我的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); 在获取语法之后立即执行,而当响应到来时应该在回调块中。 我也在您的片段类中发现了一些会导致视图不一致的问题。

就像您两次设置了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;
    }
}
mswipeRefreshLayout.setRefreshing(false); 

在您的列表器中调用此方法:

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

并删除mswipeRefreshLayout.setRefreshing(false); 来自onRefresh()方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM