不定式RecyclerView对我不起作用

Dus*_*vic 5 android

我知道之前曾多次询问过这个问题,但我很困惑为什么有时会加载数据,有时候一旦到达列表末尾就没有加载数据.此外,当我去快速滚动通过列表,以及新的数据已经加载,而是立即返回我在列表中的第一项,并从服务器中删除从下一个页面的所有新加载的项目.所以这是第二个问题和第三个问题是,当我使用SwipeRefreshLayout加载的项目,我也没有得到新的项目,当我到达列表的末尾.

我在我的项目中实现了这个:https://gist.github.com/ssinss/e06f12ef66c51252563e

list.setLayoutManager(manager);
    list.setEmptyView(emptyView);
    list.setItemAnimator(new DefaultItemAnimator());
    list.setAdapter(mAdapter);

    loadJokes(1);

    list.addOnScrollListener(new EndlessRecyclerOnScrollListener(manager) {
        @Override
        public void onLoadMore(final int current_page) {
            loadMoreJokes(current_page);
        }
    });
Run Code Online (Sandbox Code Playgroud)

这是我从服务器加载更多项目的方法:

private void loadMoreJokes(int current_page) {
    StringRequest request = new StringRequest(Request.Method.GET, AppConfig.URL_GET_ALL_JOKES + current_page,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    hideDialog();
                    try {
                        JSONObject object = new JSONObject(response);
                        boolean error = object.getBoolean("error");
                        JSONArray jokes = object.getJSONArray("jokes");
                        if (!error) {
                            for (int i = 0; i < jokes.length(); i++) {
                                JSONObject object1 = jokes.getJSONObject(i);
                                Joke joke = new Joke();
                                joke.setId(object1.optInt("id"));
                                joke.setLikes(object1.optInt("likes"));
                                joke.setComments(object1.optInt("comments"));
                                joke.setJoke(object1.optString("joke"));
                                joke.setCreatedAt(object1.optString("created_at"));
                                joke.setName(object1.optString("user_name"));
                                joke.setImagePath(object1.optString("image_path"));
                                joke.setFacebookUserId(object1.optString("facebook_user_id"));
                                joke.setCategory(object1.optString("category"));
                                mJokes.add(joke);
                            }
                            menu.showMenu(true);
                        }

                        // Notify adapter that data has changed
                        mAdapter.notifyDataSetChanged();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            hideDialog();
            Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

    AppController.getInstance().addToRequestQueue(request);
}
Run Code Online (Sandbox Code Playgroud)

这是我在有人启动应用程序时加载第一个可见项目的方法:

private void loadJokes(int page) {
    pDialog.setMessage("Loading..");
    showDialog();

    StringRequest request = new StringRequest(Request.Method.GET, AppConfig.URL_GET_ALL_JOKES + page,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    mJokes.clear();
                    hideDialog();
                    try {
                        JSONObject object = new JSONObject(response);
                        boolean error = object.getBoolean("error");
                        JSONArray jokes = object.getJSONArray("jokes");
                        if (!error) {
                            for (int i = 0; i < jokes.length(); i++) {
                                JSONObject object1 = jokes.getJSONObject(i);

                                Joke joke = new Joke();
                                joke.setId(object1.optInt("id"));
                                joke.setLikes(object1.optInt("likes"));
                                joke.setComments(object1.optInt("comments"));
                                joke.setJoke(object1.optString("joke"));
                                joke.setCreatedAt(object1.optString("created_at"));
                                joke.setName(object1.optString("user_name"));
                                joke.setImagePath(object1.optString("image_path"));
                                joke.setFacebookUserId(object1.optString("facebook_user_id"));
                                joke.setCategory(object1.optString("category"));
                                mJokes.add(joke);
                            }
                            menu.showMenu(true);
                        }

                        // Notify adapter that data has changed
                        mAdapter.notifyDataSetChanged();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            hideDialog();
            menu.showMenu(true);
            Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

    AppController.getInstance().addToRequestQueue(request);
}
Run Code Online (Sandbox Code Playgroud)

这是onRefresh()方法:

@Override
public void onRefresh() {
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            refreshItems();
        }
    }, 5000);
}

private void refreshItems() {
    loadJokes(1);

    mSwipeRefreshLayout.setRefreshing(false);
}
Run Code Online (Sandbox Code Playgroud)

如果我需要发布更多代码,请告诉我.我真的需要尽快解决这个问题.再次,问题如下:

  • 当快速滚动列表时,正在加载新项目,但之后立即将其返回到列表的开头,当我再次返回列表末尾时,加载更多不响应.

  • 刷新列表后SwipRefreshLayout,滚动也不会在最后响应.

注意:只有当我慢慢浏览列表并且我没有刷到刷新列表时,滚动和加载新项目才有效.

编辑:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_jokes, container, false);

    mContext = getActivity();
    mView = (CoordinatorLayout) view.findViewById(R.id.coordinatorLayout);

    TextView tvEmptyText = (TextView) view.findViewById(R.id.tv_empty);
    ImageView ivSignal = (ImageView) view.findViewById(R.id.iv_signal);

    if (!ConnectionDetector.getInstance(getActivity()).isOnline() && mAdapter == null) {
        tvEmptyText.setVisibility(View.VISIBLE);
        ivSignal.setVisibility(View.VISIBLE);
        showNoInternetSnackbar();
    }

    // INITIALIZE RECYCLER VIEW
    EmptyRecyclerView list = (EmptyRecyclerView) view.findViewById(R.id.list);
    mJokes = new ArrayList<>();
    mAdapter = new RecyclerJokesAdapter(getActivity(), mJokes, JokesFragment.this, null);

    // Progress dialog
    pDialog = new ProgressDialog(getActivity());
    pDialog.setMessage("Please wait");
    pDialog.setIndeterminate(true);
    pDialog.setCancelable(false);

    showDialog();

    View emptyView = inflater.inflate(R.layout.layout_empty_view, container, false);

    FloatingActionButton fab1 = (FloatingActionButton) view.findViewById(R.id.fab_funny);
    FloatingActionButton fab2 = (FloatingActionButton) view.findViewById(R.id.fab_good_morning);
    FloatingActionButton fab3 = (FloatingActionButton) view.findViewById(R.id.fab_good_night);
    FloatingActionButton fab4 = (FloatingActionButton) view.findViewById(R.id.fab_all);
    menu = (FloatingActionMenu) view.findViewById(R.id.menu_sort_jokes);

    fab1.setOnClickListener(this);
    fab2.setOnClickListener(this);
    fab3.setOnClickListener(this);
    fab4.setOnClickListener(this);

    mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_container);
    mSwipeRefreshLayout.setOnRefreshListener(this);
    mSwipeRefreshLayout.setColorSchemeResources(
            R.color.refresh_progress_1,
            R.color.refresh_progress_2,
            R.color.refresh_progress_3);

    LinearLayoutManager manager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);

    list.setLayoutManager(manager);
    list.setEmptyView(emptyView);
    list.setItemAnimator(new DefaultItemAnimator());
    list.setAdapter(mAdapter);

    if (ConnectionDetector.getInstance(mContext).isOnline()) {
        loadJokes(1);
    } else {
        showNoInternetSnackbar();
        hideDialog();
    }

    list.addOnScrollListener(new EndlessRecyclerOnScrollListener(manager) {
        @Override
        public void onLoadMore(final int current_page) {
            loadMoreJokes(current_page);
        }
    });

    return view;
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*tel 0

使用这个包装类

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;

import java.util.List;

public abstract class RecyclerWrapperAdapter<E> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    protected Context context;
    protected List<E> objects;

    public void setContext(Context context) {
        this.context = context;
    }

    public void setObjects(List<E> objects) {
        this.objects = objects;
        notifyDataSetChanged();
    }

    public void add(@NonNull E object) {
        objects.add(object);
        notifyDataSetChanged();
    }

    public void add(int position, @NonNull E object) {
        if (position < objects.size() && position >= 0) {
            objects.add(position, object);
            notifyItemChanged(position);
            notifyDataSetChanged();
        } else if (position >= objects.size()) {
            objects.add(object);
            notifyDataSetChanged();
        }
    }

    public void set(int position, @NonNull E object) {
        if (position < objects.size() && position >= 0) {
            objects.set(position, object);
            notifyItemChanged(position);
        } else if (position >= objects.size()) {
            objects.add(object);
            notifyDataSetChanged();
        }
    }

    public void remove(@NonNull E object) {
        objects.remove(object);
        notifyDataSetChanged();
    }

    public void remove(int position) {
        if (position >=0 && position < objects.size()) {
            objects.remove(position);
            notifyDataSetChanged();
        }
    }

    public void removeAll() {
        objects.clear();
        notifyDataSetChanged();
    }

    public E getItem(int position) {
        return objects.get(position);
    }

    @Override
    public int getItemCount() {
        return objects.size();
    }
}
Run Code Online (Sandbox Code Playgroud)