[英]SwipeRefreshLayout with RecyclerView not working in Fragment
[英]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.