RecyclerView中的无尽滚动:我该如何实现?

时间:2016-04-07 08:58:06

标签: android json android-recyclerview infinite-scroll

我想用Adapters&编码无限滚动RecyclerViews和我从JSON用Volley获取我的物品。虽然我已阅读这些指南(Codepathgithub),但我发现很难将其应用到我自己的场景中。

我的json的网址格式为:https://example.com/json/items?page=1https://example.com/json/items?page=2https://example.com/json/items?page=3等。

以下是我使用的代码:

MainActivity

public class MainActivity extends AppCompatActivity {

    private final String TAG = "MainActivity";

    private int number = 1;

    //Creating a list of videos
    private List<VideoItems> mVideoItemsList;

    //Creating Views
    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;
    private RecyclerView.LayoutManager layoutManager;
    private ProgressDialog mProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate called");

        //Initializing Views
        recyclerView = (RecyclerView) findViewById(R.id.video_recycler);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);


        // This method was copied from codepath (above url)
        // Add the scroll listener
        recyclerView.addOnScrollListener(new EndlessRecyclerViewScrollListener(layoutManager) {

            @Override
            public void onLoadMore(int page, int totalItemsCount) {
                // Triggered only when new data needs to be appended to the list
                // Add whatever code needed to append new items of the list
                customLoadMoreDataFromApi(page);
            }
        });




        //Initializing the videolist
        mVideoItemsList = new ArrayList<>();
        adapter = new VideoAdapter(mVideoItemsList, this);

        recyclerView.setAdapter(adapter);

        if (NetworkCheck.isAvailableAndConnected(this)) {

            //Calling method to get data
            getData();
        } else {
            //Codes for building Alert Dialog
            alertDialogBuilder.setPositiveButton(R.string.alert_retry, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if (!NetworkCheck.isAvailableAndConnected(mContext)) {
                        alertDialogBuilder.show();
                    } else {
                        getData();
                    }

                }
            });
            alertDialogBuilder.setNegativeButton(R.string.alert_cancel, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();

                }
            });
            alertDialogBuilder.show();

        }


    }

    public int getNumber() {
        return number++;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    // This method was copied from codepath (above is url)
    // Append more data into the adapter
    // This method probably sends out a network request and appends new data items to your adapter;
    public  void customLoadMoreDataFromApi (int offset) {
        // Send an API request to retrieve appropriate data using the offset value as a parameter.
        // Deserialize API request and then construct new objects to append to the adapter.
        // Add the new objects to the data source for adapter
        mVideoItemsList.addAll(moreVideos);
        // For efficiency purpose, notify the adapter of the only elements inserted that got changed
        // curSize will be equal to the index of the first element inserted because the list is 0-indexed
        int curSize = adapter.getItemCount();
        adapter.notifyItemRangeChanged(curSize, mVideoItemsList.size() - 1);
    }

    //This method will get data from the web api
    private void getData(){


        Log.d(TAG, "getData called");
        //Codes for Showing progress dialog

        //Creating a json request
        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(ConfigVideo.GET_URL + getNumber(),
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, "onResponse called");
                        //Dismissing the progress dialog
                        if (mProgressDialog != null) {
                            mProgressDialog.hide();
                        }
                   //calling method to parse json array
                        parseData(response);

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                });

        //Creating request queue
        RequestQueue requestQueue = Volley.newRequestQueue(this);

        //Adding request to the queue
        requestQueue.add(jsonArrayRequest);

    }

    //This method will parse json data
    private void parseData(JSONArray array){
        Log.d(TAG, "Parsing array");

        for(int i = 0; i<array.length(); i++) {
            VideoItems videoItem = new VideoItems();
            JSONObject jsonObject = null;
            try {
                jsonObject = array.getJSONObject(i);
                videoItem.setVideo_title(jsonObject.getString(ConfigVideo.TAG_VIDEO_TITLE));
                videoItem.setVideo_body(jsonObject.getString(ConfigVideo.TAG_VIDEO_BODY));

            } catch (JSONException w) {
                w.printStackTrace();
            }
            mVideoItemsList.add(videoItem);


        }

        adapter.notifyItemRangeChanged(0, adapter.getItemCount());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy called");
        if (mProgressDialog != null){
            mProgressDialog.dismiss();
            Log.d(TAG, "mProgress dialog dismissed");

        }
    }

}

EndlessRecyclerViewScrollListener 代码链接为EndlessRecyclerViewScrollListener

在我的项目中,我删除了所有与GridLayoutManagerStaggeredGridLayoutManager有关的代码,因为我不需要它们。

VideoAdapter

public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.ViewHolder>{

    private ImageLoader imageLoader;
    private Context mContext;

    //List of videos
    private List<VideoItems> mVideoItems;

   public VideoAdapter(List<VideoItems> videoItems, Context context) {
       super();

       // Getting all videos
       this.mVideoItems = videoItems;
       this.mContext = context;
   }

    @Override
    public ViewHolder  onCreateViewHolder (ViewGroup parent, int viewType) {
        View v =  LayoutInflater.from(parent.getContext())
                .inflate(R.layout.video_summ, parent, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        VideoItems videoList = mVideoItems.get(position);
        holder.videoTitle.setText(videoList.getVideo_title());
        holder.videoBody.setText(videoList.getVideo_body());
    }


    @Override
    public int getItemCount(){
        //Return the number of items in the data set
        return mVideoItems.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        public NetworkImageView videoImage;
        public TextView videoTitle, videoBody;

        public ViewHolder (View videoView) {
            super(videoView);
            videoTitle = (TextView) videoView.findViewById(R.id.video_title);
            videoBody = (TextView) videoView.findViewById(R.id.video_body);
        }
    }

}

VideoItems

public class VideoItems {
    private String video_title;
    private String video_body;

    public String getVideo_title() {
        return video_title;
    }

    public void setVideo_title(String video_title) {
        this.video_title = video_title;
    }

    public String getVideo_body() {
        return video_body;
    }

    public void setVideo_body(String video_body) {
        this.video_body = video_body;
    }
}

我不知道您是否可以向我提供有关如何将其实施到我的RecyclerView的提示。提前谢谢。

0 个答案:

没有答案