Android RecyclerView导致刷新时强制停止
我使用的是这个网站上的Recyclerview 当我刷新recyclerview并同时滚动时,应用程序将强制关闭Android RecyclerView导致刷新时强制停止,android,asynchronous,android-asynctask,android-recyclerview,Android,Asynchronous,Android Asynctask,Android Recyclerview,我使用的是这个网站上的Recyclerview 当我刷新recyclerview并同时滚动时,应用程序将强制关闭 public class NewsFeed extends Fragment implements MyDynamicRecyclerView.SwipeRefreshListener, MyDynamicRecyclerView.LoadMoreListener { MyDynamicRecyclerView myRecyclerview; NewsFeedAdapter tes
public class NewsFeed extends Fragment implements MyDynamicRecyclerView.SwipeRefreshListener, MyDynamicRecyclerView.LoadMoreListener {
MyDynamicRecyclerView myRecyclerview;
NewsFeedAdapter testAdapter;
ArrayList<ProgramModel> modelArrayList;
LinearLayoutManager linearLayoutManager;
Dialog dialog;
int limit;
private boolean firstSwipe;
public NewsFeed() {
// Required empty public constructor
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("NewsFeedFragment", "Destroyed");
if (dialog != null)
dialog.dismiss();
}
@Override
public void onPause() {
super.onPause();
Log.i("NewsFeedFragment", "Paused");
if (dialog != null)
dialog.dismiss();
}
@Override
public void onResume() {
super.onResume();
Log.i("NewsFeedFragment", "Resumed");
firstSwipe = false;
if (checkInternetForNewsFeed() && firstSwipe) {
removeItems();
new FetchBooks(false).execute();
firstSwipe = false;
Log.d("Swipe", "First swipe");
} else if (checkInternetForNewsFeed() && !firstSwipe) {
fetchAllBooksByHeader();
firstSwipe = true;
Log.d("Swipe", "Not first swipe");
} else {
myRecyclerview.showInfoLayout();
}
getActivity().setTitle("Të gjithë");
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.i("NewsFeedFragment", "Created");
View v = inflater.inflate(R.layout.news_feed_fragment_layout, container, false);
dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.setContentView(R.layout.loading_layout);
myRecyclerview = (MyDynamicRecyclerView) v.findViewById(R.id.myRecyclerview);
modelArrayList = new ArrayList<>();
testAdapter = new NewsFeedAdapter(getActivity().getApplicationContext(), modelArrayList, (AppCompatActivity) getActivity(), this, false);
linearLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
myRecyclerview.setScrollContainer(false);
myRecyclerview.setBackgroundColor("#FFFFFF");
myRecyclerview.setSwipeRefresh(true);
myRecyclerview.setColorSchemeColors(Color.RED, Color.YELLOW, Color.BLACK, Color.GREEN, Color.BLUE);
myRecyclerview.setLoadMore(true, linearLayoutManager);
myRecyclerview.setLoadMoreListener(this);
myRecyclerview.setOnRefreshListener(this);
myRecyclerview.setLayoutManager(linearLayoutManager);
myRecyclerview.setItemAnimator(new DefaultItemAnimator());
myRecyclerview.setSimpleDivider(false);
myRecyclerview.setAdapter(testAdapter);
limit = 0;
if (checkInternetForNewsFeed()) {
firstSwipe = false;
fetchAllBooksFromDB();
} else {
firstSwipe = true;
myRecyclerview.showInfoLayout();
}
return v;
}
public void fetchAllBooksByHeader() {
limit = 0;
if (modelArrayList.size() >= 1) {
removeItems();
}
new FetchBooks(true).execute();
testAdapter.notifyDataSetChanged();
}
public void fetchAllBooksFromDB() {
if (modelArrayList.size() >= 1) {
removeItems();
}
new FetchBooks(false).execute();
testAdapter.notifyDataSetChanged();
}
public void addHeader() {
if (modelArrayList.size() == 0)
modelArrayList.add(new ProgramModel());
}
public void addItem(String title, String author, String imageName) {
modelArrayList.add(new ProgramModel(title, author, imageName));
testAdapter.notifyDataSetChanged();
}
public void removeItems() {
modelArrayList.clear();
addHeader();
}
@Override
public void OnRefresh() {
getActivity().setTitle("Të gjithë");
limit = 0;
if (checkInternetForNewsFeed() && firstSwipe) {
removeItems();
new FetchBooks(false).execute();
firstSwipe = false;
Log.d("Swipe", "First swipe");
} else if (checkInternetForNewsFeed() && !firstSwipe) {
removeItems();
new FetchBooks(true).execute();
Log.d("Swipe", "Not first swipe");
} else {
myRecyclerview.showInfoLayout();
}
myRecyclerview.stopSwipeRefresh();
}
private boolean checkInternetForNewsFeed() {
if (new ConnectivityState(getActivity()).isConnected()) {
myRecyclerview.hideInfoLayout();
return true;
} else {
// Fonts for the title and the message of the content
Typeface messageTypeface = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Roboto-Light.ttf");
Typeface titleTypeface = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Roboto-Bold.ttf");
// Setting up the content
myRecyclerview.setInfoIcon(R.drawable.warning_icon, "#000000");
myRecyclerview.setInfoTitle("Nuk jeni i lidhur me internet.", 18, Color.GRAY, titleTypeface);
myRecyclerview.setInfoMessage("Rifreskoni edhe njëherë për të kontrolluar aksesin në internet.", 13, Color.GRAY, messageTypeface);
return false;
}
}
@Override
public void OnLoadMore() {
new FetchBooks(true).execute();
MyDynamicToast.informationMessage(AppController.getInstance(), "...");
}
public static void hideLoadingDialogFromBookActivity(Dialog d) {
d.hide();
}
private class FetchBooks extends AsyncTask<Void, Void, Void> {
private boolean reload;
FetchBooks(boolean reload) {
this.reload = reload;
}
@Override
protected void onPreExecute() {
}
@Override
protected Void doInBackground(Void... params) {
getBooksFromDB();
return null;
}
private void getBooksFromDB() {
StringRequest requestBooks = new StringRequest(Request.Method.GET, AppConfig.URL_FETCH_BOOKS, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray jsonArray = new JSONArray(response);
for (int i = limit; i < jsonArray.length(); i++) {
if (i < (limit + 5)) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String imageName = "http://ec2-52-39-232-168.us-west-2.compute.amazonaws.com/files/books/" + jsonObject.getString("cover");
modelArrayList.add(new ProgramModel(jsonObject.getString("title"), jsonObject.getString("author"), imageName));
} else {
break;
}
}
limit += 5;
if (reload) {
testAdapter.notifyDataSetChanged();
}
} catch (JSONException e) {
e.printStackTrace();
MyDynamicToast.errorMessage(AppController.getInstance(), "" + e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
MyDynamicToast.errorMessage(AppController.getInstance(), "Request did not work!");
}
});
AppController.getInstance().addToRequestQueue(requestBooks);
}
}
}
公共类新闻提要扩展片段实现MyDynamicRecycleView.SwipeRefreshListener、MyDynamicRecycleView.LoadMoreListener{
MyDynamicRecyclerView myRecyclerview;
NewsFeedAdapter测试适配器;
ArrayList模型ArrayList;
直线布局经理直线布局经理;
对话;
整数极限;
私有布尔第一刷;
公共新闻提要(){
//必需的空公共构造函数
}
@凌驾
公共空间{
super.ondestory();
Log.i(“NewsFeedFragment”,“销毁”);
如果(对话框!=null)
dialog.dismise();
}
@凌驾
公共无效暂停(){
super.onPause();
Log.i(“NewsFeedFragment”,“暂停”);
如果(对话框!=null)
dialog.dismise();
}
@凌驾
恢复时公开作废(){
super.onResume();
Log.i(“NewsFeedFragment”,“Resume”);
firstSwipe=false;
如果(选中InternetForNewsfeed()&第一次滑动){
removitems();
new FetchBooks(false).execute();
firstSwipe=false;
Log.d(“刷卡”、“第一次刷卡”);
}else if(检查InternetForNewsfeed()&&!首次滑动){
fetchAllBooksByHeader();
firstSwipe=true;
Log.d(“刷卡”,“不是第一次刷卡”);
}否则{
myRecyclerview.showInfoLayout();
}
getActivity().setTitle(“Tëgjithë”);
}
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
Log.i(“NewsFeedFragment”,“Created”);
视图v=充气机。充气(R.layout.news\u feed\u fragment\u layout,container,false);
dialog=新建对话框(getActivity());
对话框.requestWindowFeature(窗口.FEATURE\u无\u标题);
dialog.getWindow().setBackgroundDrawable(新的ColorDrawable(Color.TRANSPARENT));
setContentView(R.layout.loading_layout);
myRecyclerview=(MyDynamicRecyclerView)v.findViewById(R.id.myRecyclerview);
modelArrayList=新建ArrayList();
testAdapter=新的NewsFeedAdapter(getActivity().getApplicationContext(),modelArrayList,(AppCompatActivity)getActivity(),this,false);
linearLayoutManager=新的linearLayoutManager(getActivity().getApplicationContext());
myRecyclerview.setScrollContainer(假);
myRecyclerview.setBackgroundColor(“#FFFFFF”);
myRecyclerview.setSwipeRefresh(true);
myRecyclerview.setColorSchemeColors(颜色.红色,颜色.黄色,颜色.黑色,颜色.绿色,颜色.蓝色);
myRecyclerview.setLoadMore(true,linearLayoutManager);
myRecyclerview.setLoadMoreListener(这个);
myRecyclerview.setOnRefreshListener(此);
myRecyclerview.setLayoutManager(linearLayoutManager);
setItemAnimator(新的DefaultItemAnimator());
myRecyclerview.SetImpleDivider(假);
myRecyclerview.setAdapter(testAdapter);
极限=0;
如果(检查InternetForNewsfeed()){
firstSwipe=false;
fetchAllBooksFromDB();
}否则{
firstSwipe=true;
myRecyclerview.showInfoLayout();
}
返回v;
}
public void fetchAllBooksByHeader(){
极限=0;
如果(modelArrayList.size()>=1){
removitems();
}
new FetchBooks(true.execute();
testAdapter.notifyDataSetChanged();
}
public void fetchAllBooksFromDB(){
如果(modelArrayList.size()>=1){
removitems();
}
new FetchBooks(false).execute();
testAdapter.notifyDataSetChanged();
}
公共void addHeader(){
if(modelArrayList.size()==0)
添加(新的ProgramModel());
}
public void addItem(字符串标题、字符串作者、字符串图像名){
添加(新的程序模型(标题、作者、图像名));
testAdapter.notifyDataSetChanged();
}
公共无效删除项(){
modelArrayList.clear();
addHeader();
}
@凌驾
公共void OnRefresh(){
getActivity().setTitle(“Tëgjithë”);
极限=0;
如果(选中InternetForNewsfeed()&第一次滑动){
removitems();
new FetchBooks(false).execute();
firstSwipe=false;
Log.d(“刷卡”、“第一次刷卡”);
}else if(检查InternetForNewsfeed()&&!首次滑动){
removitems();
new FetchBooks(true.execute();
Log.d(“刷卡”,“不是第一次刷卡”);
}否则{
myRecyclerview.showInfoLayout();
}
myRecyclerview.stopSwipeRefresh();
}
私有布尔值checkInternetForNewsFeed(){
if(新连接状态(getActivity()).isConnected()){
myRecyclerview.hideInfo布局();
返回true;
}否则{
//内容标题和消息的字体
Typeface messageTypeface=Typeface.createFromAsset(getActivity().getAssets(),“font/Roboto Light.ttf”);
Typeface titleTypeface=Typeface.createFromAsset(getActivity().getAssets(),“font/Roboto Bold.ttf”);
//设置内容
myRecyclerview.setInfoIcon(R.drawable.warning_图标,“#000000”);
myRecyclerview.setInfoTitle(“Nuk jeni i lidhur me internet.”,18,Color.GRAY,titleTypeface);
myRecyclerview.setInfoMessage(“Rifreskoni edhe njëherëpër tëkontrolluar Aksein nëinternet.”,13,Color.GRAY,message字体);
返回false;
}
}
@凌驾
public void OnLoadMore(){
new FetchBooks(true.execute();
MyDynamicToast.informationMessage(AppController.getInstance(),“…”);
}
公共静态无效hideLoadingDialogFromBookActivity(对话框d){
d、 隐藏();
}
私有类FetchBooks扩展异步任务{
私有布尔重载;
FetchBooks(布尔重新加载){
this.reload=重新加载;
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的Void doInBackground(Void…参数){
getBooksFromDB();
返回null;
}
私有void getBooksFromDB(){
StringRequestBooks=newStringRequest(Request.Method.GET,AppConfig.URL\u FETCH\u BOOKS,new Response.Listener()){
@凌驾
公众回应(Stri)
new FetchBooks(false).execute(); // runs in background and modifies list
testAdapter.notifyDataSetChanged(); // executes immediately
void setBooks(List<Book> books) {
mBooks = books; // swap the whole list
notifyDataSetChanged(); // notify of change
}