如何设置从Android中的数据加载下一页数据

时间:2016-04-28 06:08:02

标签: android json

我想开发一个网站的Android应用程序。我从json阅读网站帖子并在每10个帖子中显示它在RecyclerView中,当用户在RecyclerView上滚动显示更多10个帖子并结束时!在这个项目中,我使用okHTTP v3RecyclerView
Json链接:JSON LINK
我可以加载前10个帖子。我想在下一个10贴的时候在RecyclerView上滚动显示,但是先发布给我10个帖子!

主要活动代码:

public class Main_page extends AppCompatActivity {

    private static final long RIPPLE_DURATION = 250;
    private Toolbar toolbar;
    private RelativeLayout root;
    private ImageView menu_image;
    private RecyclerView main_recyclerView;
    private MainAdapter2 mAdaper;
    private List<MainDataModel> dataModels = new ArrayList<MainDataModel>();
    private List<MainDataModel> dataModelsArray;
    private Context context;
    protected Handler handler;
    private RelativeLayout loadLayout;
    private LinearLayoutManager mLayoutManager;
    private int pageCount = 1;
    private String ServerAddress = ServerIP.getIP();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_page);
        if (!EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().register(this);
        }
        handler = new Handler();
        context = getApplicationContext();
        loadLayout = (RelativeLayout) findViewById(R.id.main_empty_layout);
        toolbar = (Toolbar) findViewById(R.id.main_toolbar);
        if (toolbar != null) {
            setSupportActionBar(toolbar);
            getSupportActionBar().setTitle(null);
        }
        LoadData(pageCount);
        mLayoutManager = new LinearLayoutManager(this);
        // Menu
        root = (RelativeLayout) findViewById(R.id.main_root);
        View guillotineMenu = LayoutInflater.from(this).inflate(R.layout.menu_layout, null);
        root.addView(guillotineMenu);
        menu_image = (ImageView) toolbar.findViewById(R.id.toolbar_logo);
        new GuillotineAnimation.GuillotineBuilder(guillotineMenu, guillotineMenu.findViewById(R.id.menu_layout_image), menu_image)
                .setStartDelay(RIPPLE_DURATION)
                .setActionBarViewForAnimation(toolbar)
                .setClosedOnStart(true)
                .build();
        // RecyclerView and setData
        main_recyclerView = (RecyclerView) findViewById(R.id.main_recycler);
        main_recyclerView.setHasFixedSize(true);
        main_recyclerView.setLayoutManager(mLayoutManager);

        mAdaper = new MainAdapter2(this, main_recyclerView, dataModels);
        main_recyclerView.setAdapter(mAdaper);

        mAdaper.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                dataModels.add(null);
                mAdaper.notifyItemInserted(dataModels.size() - 1);
                LoadData(pageCount);
            }
        });
    }

    @Subscribe
    public void onEvent(List<MainDataModel> mainInfoModels) {
        if (dataModels.size() > 0) {
            dataModels.remove(dataModels.size() - 1);
            mAdaper.notifyItemRemoved(dataModels.size());
            mAdaper.setLoaded();
        }

        mAdaper.add(mainInfoModels);
        mAdaper.notifyDataSetChanged();
        ++pageCount;

        if (dataModels.isEmpty()) {
            main_recyclerView.setVisibility(View.GONE);
            loadLayout.setVisibility(View.VISIBLE);

        } else {
            main_recyclerView.setVisibility(View.VISIBLE);
            loadLayout.setVisibility(View.GONE);
        }
    }

    private void LoadData(int pageNumber) {
        MainDataInfo dataInfo = new MainDataInfo();
        // here getMainDataInfo() should return the server response
        dataInfo.getMainDataInfo(this, pageNumber);
    }
}

AsyncTask代码:

public class MainDataInfo {
    private Context mContext;
    private String ServerAddress = ServerIP.getIP();

    public void getMainDataInfo(Context context, int pageNumber) {
        mContext = context;
        new getInfo().execute(ServerAddress + "page=" + pageNumber);
    }

    private class getInfo extends AsyncTask<String, Void, String> {
        EventBus bus = EventBus.getDefault();
        private String ou_response;
        private List<MainDataModel> infoModels;

        @Override
        protected void onPreExecute() {
            CustomProcessDialog.createAndShow(mContext);
            infoModels = new ArrayList<>();
        }

        @Override
        protected String doInBackground(String... params) {
            OkHttpClient client = new OkHttpClient();

            Request request = new Request.Builder()
                    .url(ServerAddress + "page=1")
                    .cacheControl(CacheControl.FORCE_NETWORK)
                    .build();

            Response response;
            try {
                response = client.newCall(request).execute();
                ou_response = response.body().string();
                response.body().close();
                if (ou_response != null) {
                    try {
                        JSONObject postObj = new JSONObject(ou_response);
                        JSONArray postsArray = postObj.optJSONArray("posts");
                        infoModels = new ArrayList<>();

                        for (int i = 0; i <= infoModels.size(); i++) {
                            JSONObject postObject = (JSONObject) postsArray.get(i);
                            JSONObject images = postObject.optJSONObject("thumbnail_images");
                            JSONObject imagesPair = images.optJSONObject("medium");

                            int id = postObject.getInt("id");
                            String title = postObject.getString("title");
                            String content = postObject.getString("content");
                            String thumbnail = imagesPair.getString("url");
                            Log.d("Data", "Post id: " + id);
                            Log.d("Data", "Post title: " + title);
                            Log.d("Data", "Post title: " + thumbnail);

                            //Use the title and id as per your requirement
                            infoModels.add(new MainDataModel(id, title, content, thumbnail));
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return ou_response;
        }

        @Override
        protected void onPostExecute(String result) {
            CustomProcessDialog.dissmis();
            if (result != null) {
                bus.post(infoModels);
            }
        }
    }
}

如果在RecyclerView节目的实例上再次显示10个帖子后,如何显示下一个10个帖子?

2 个答案:

答案 0 :(得分:0)

我检查了你的JSON,当你增加页码时没有结果。请先修复它以在您的应用中显示结果。

虽然this one给你回复了10个帖子

当您设置page number 2时,它不会返回任何帖子,这就是您每次发布前10个帖子的原因。

希望它有所帮助。

答案 1 :(得分:0)

您必须制作不同的页面。一页只有10个博客的数据。要获取有关的信息,请在显示第10项时从下一页请求JSON。 要获取项目显示的信息,您可以使用layoutManager.findLastVisbleItem()或lastComletlyVisibleItem()。

下载请求的数据后。在Volley中必须有类似onRequestComleted()的方法。 notifysetChanged那里。