在Android上的RecyclerView中加载来自Json的更多数据

时间:2016-05-08 13:49:36

标签: android json

我想开发一个网站的Android应用程序。我阅读了json的网站帖子并在RecyclerView中每10个帖子显示一次,当用户在RecyclerView上滚动显示更多10个帖子并结束时!在这个项目中,我使用okHTTP v3RecyclerView

Json链接: JSON LINK

我可以加载前10个帖子。我希望滚动RecyclerView显示下一个10帖子

ServerIP类:

public class ServerIP_cat {
    private static String IP = "http://tellfa.com/tafrihgah/?json=get_category_posts&";

    public static String getCatIP() {
        return IP;
    }
}

我的活动代码:

public class Category_page extends AppCompatActivity {

    private static final long RIPPLE_DURATION = 250;
    private Toolbar toolbar;
    private TextView toolbar_title;
    private ImageView toolbar_menuImage;
    private RelativeLayout root;
    private MainAdapter_loadMore mAdapter;
    private RecyclerView cat_recyclerView;
    private List<MainDataModel> dataModels = new ArrayList<MainDataModel>();
    private LinearLayoutManager mLayoutManager;
    private RelativeLayout loadLayout;
    private String catTitle = "", catID = "";
    private Bundle bundle;
    private int pageCount = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.category_page);
        //if (!EventBus.getDefault().isRegistered(this)) {
        //   EventBus.getDefault().register(this);
        //}

        // Initializing
        toolbar = (Toolbar) findViewById(R.id.category_toolbar);
        cat_recyclerView = (RecyclerView) findViewById(R.id.category_recycler);
        toolbar_title = (TextView) toolbar.findViewById(R.id.toolbar_pages_title);
        mLayoutManager = new LinearLayoutManager(this);
        root = (RelativeLayout) findViewById(R.id.category_root);
        loadLayout = (RelativeLayout) findViewById(R.id.category_empty_layout);
        mAdapter = new MainAdapter_loadMore(this, cat_recyclerView, dataModels);
        // Toolbar
        setSupportActionBar(toolbar);
        if (toolbar != null) {
            getSupportActionBar().setTitle("");
        }

        // Receive Data
        bundle = getIntent().getExtras();
        catID = bundle.getString("categoryID");
        if (bundle != null) {
            catTitle = bundle.getString("categoryTitle");
        }
        if (catTitle != null) {
            toolbar_title.setText(catTitle);
        }
        // Load data
        LoadData(catID);

        // Menu
        View guillotineMenu = LayoutInflater.from(this).inflate(R.layout.menu_layout, null);
        root.addView(guillotineMenu);
        toolbar_menuImage = (ImageView) toolbar.findViewById(R.id.toolbar_pages_logo);
        new GuillotineAnimation.GuillotineBuilder(guillotineMenu, guillotineMenu.findViewById(R.id.menu_layout_image), toolbar_menuImage)
                .setStartDelay(RIPPLE_DURATION)
                .setActionBarViewForAnimation(toolbar)
                .setClosedOnStart(true)
                .build();

        // RecyclerView
        cat_recyclerView.setLayoutManager(mLayoutManager);
        cat_recyclerView.setHasFixedSize(true);
        cat_recyclerView.setAdapter(mAdapter);
        // Load More data
        mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                dataModels.add(null);
                mAdapter.notifyItemInserted(dataModels.size() - 1);
                LoadMoreData(catID, pageCount);
            }
        });
    }

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

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

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

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

    public void post_back(View view) {
        onBackPressed();
    }

    private void LoadData(String CatID) {
        CatDataInfo catDataInfo = new CatDataInfo();
        catDataInfo.getCatDataInfo(this, CatID);
    }

    private void LoadMoreData(String CatID, int pageNumber) {
        CatDataInfo_loadMore catDataInfo_loadMore = new CatDataInfo_loadMore();
        catDataInfo_loadMore.getCatDataInfo_loadMore(this, CatID, pageNumber);
    }

    @Override
    public void onResume() {
        super.onResume();
        EventBus.getDefault().register(this);
    }

    @Override
    public void onPause() {
        EventBus.getDefault().unregister(this);
        super.onPause();
    }
}

AsynTask课程:

public class CatDataInfo_loadMore {
    private Context mContext;
    private String ServerAddress = ServerIP_cat.getCatIP();

    public void getCatDataInfo_loadMore(Context context, String catID, int pageCount) {
        mContext = context;
        new getInfo().execute(ServerAddress + "id=" + catID + "&page=" + pageCount);
    }

    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();

            String url = (String) params[0];
            Request request = new Request.Builder()
                    .url(url)
                    .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);
                            // Thumbnail
                            JSONObject images = postObject.optJSONObject("thumbnail_images");
                            JSONObject imagesPair = images.optJSONObject("medium");
                            // Author
                            JSONObject Author = postObject.optJSONObject("author");
                            // Category
                            JSONArray category = postObject.getJSONArray("categories");
                            for (int j = 0; j < category.length(); j++) {
                                JSONObject categoryObject = category.getJSONObject(j);

                                int id = postObject.getInt("id");
                                String title = postObject.getString("title");
                                String content = postObject.getString("content");
                                String dateTime = postObject.getString("date");
                                String thumbnail = imagesPair.getString("url");
                                String authorShow = Author.getString("name");
                                String categoryShow = categoryObject.getString("title");
                                String category_id = categoryObject.getString("id");

                                Log.d("Data", "Post ID: " + id);
                                Log.d("Data", "Post title: " + title);
                                Log.d("Data", "Post image: " + thumbnail);
                                Log.d("Data", "Post author: " + authorShow);
                                Log.d("Data", "Post category: " + categoryShow);
                                Log.d("Data", "Post category ID: " + category_id);
                                Log.d("Data", "---------------------------------");

                                //Use the title and id as per your requirement
                                infoModels.add(new MainDataModel(id, title, content, dateTime, authorShow, categoryShow, category_id, 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);
            }
        }
    }
}

适配器类:

public class MainAdapter_loadMore extends RecyclerView.Adapter {

    private List<MainDataModel> mDateSet;
    private Context mContext;

    private final int VIEW_ITEM = 1;
    private final int VIEW_PROG = 0;

    // The minimum amount of items to have below your current scroll position
    // before loading more.
    private int visibleThreshold = 7;
    private int lastVisibleItem, totalItemCount;
    private boolean loading;
    private OnLoadMoreListener onLoadMoreListener;

    public MainAdapter_loadMore(Context context, RecyclerView recyclerView, List<MainDataModel> dataSet) {
        this.mContext = context;
        this.mDateSet = dataSet;

        if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {

            final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView
                    .getLayoutManager();
            recyclerView
                    .addOnScrollListener(new RecyclerView.OnScrollListener() {
                        @Override
                        public void onScrolled(RecyclerView recyclerView,
                                               int dx, int dy) {
                            super.onScrolled(recyclerView, dx, dy);
                            totalItemCount = linearLayoutManager.getItemCount();
                            lastVisibleItem = linearLayoutManager
                                    .findLastVisibleItemPosition();
                            if (!loading
                                    && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                                // End has been reached
                                // Do something
                                if (onLoadMoreListener != null) {
                                    onLoadMoreListener.onLoadMore();
                                }
                                loading = true;
                            }
                        }
                    });
        }
    }

    @Override
    public int getItemViewType(int position) {
        return mDateSet.get(position) != null ? VIEW_ITEM : VIEW_PROG;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        RecyclerView.ViewHolder vh;
        if (viewType == VIEW_ITEM) {
            View v = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.post_card_layout, parent, false);

            vh = new DataViewHolder(v);
        } else {
            View v = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.progressbar_item, parent, false);

            vh = new ProgressViewHolder(v);
        }
        return vh;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

        if (holder instanceof DataViewHolder) {
            ((DataViewHolder) holder).main_post_title.setText(Html.fromHtml(mDateSet.get(position).getTitle()));

            Glide.with(mContext)
                    .load(mDateSet.get(position).getThumbnail())
                    .placeholder(R.drawable.post_image)
                    .crossFade()
                    .into(((DataViewHolder) holder).main_post_image);

            ((DataViewHolder) holder).main_post_content.setText(Html.fromHtml(mDateSet.get(position).getContent()));

            ((DataViewHolder) holder).main_dateTime.setText(Html.fromHtml(mDateSet.get(position).getDateTime()));

            ((DataViewHolder) holder).main_author.setText(Html.fromHtml(mDateSet.get(position).getAuthor()));

            ((DataViewHolder) holder).main_category.setText(Html.fromHtml(mDateSet.get(position).getCategory()));
            ((DataViewHolder) holder).main_category.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = holder.getPosition();
                    MainDataModel model = mDateSet.get(pos);
                    v.getContext().startActivity(new Intent(v.getContext(), Category_page.class)
                            .putExtra("categoryTitle", model.getCategory())
                            .putExtra("categoryID", model.getCategoryID()));
                }
            });

            ((DataViewHolder) holder).main_post_image.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = holder.getPosition();
                    MainDataModel model = mDateSet.get(pos);
                    v.getContext().startActivity(new Intent(v.getContext(), PostShow_page.class)
                            .putExtra("title", model.getTitle())
                            .putExtra("image", model.getThumbnail())
                            .putExtra("content", model.getContent())
                            .putExtra("dateTime", model.getDateTime())
                            .putExtra("author", model.getAuthor())
                            .putExtra("category", model.getCategory()));

                }
            });

        } else {
            ((ProgressViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
        }
    }

    public void setLoaded() {
        loading = false;
    }

    @Override
    public int getItemCount() {
        return mDateSet.size();
    }

    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
        this.onLoadMoreListener = onLoadMoreListener;
    }

    public void remove(int position) {
        mDateSet.remove(position);
        notifyItemRemoved(position);
    }

    public void clear() {
        mDateSet.clear();
        notifyDataSetChanged();
    }


    public void add(List<MainDataModel> models) {
        mDateSet.addAll(models);
        notifyDataSetChanged();
    }

    public void update(List<MainDataModel> models) {
        mDateSet.clear();
        mDateSet.addAll(models);
        notifyDataSetChanged();
    }

    public class DataViewHolder extends RecyclerView.ViewHolder {

        private TextView main_post_title, main_post_content, main_dateTime, main_author, main_category;
        private ImageView main_post_image;

        public DataViewHolder(final View itemView) {
            super(itemView);

            main_post_title = (TextView) itemView.findViewById(R.id.post_content_title);
            main_post_image = (ImageView) itemView.findViewById(R.id.post_picture_image);
            main_post_content = (TextView) itemView.findViewById(R.id.post_content_text);
            main_dateTime = (TextView) itemView.findViewById(R.id.post_date_text);
            main_author = (TextView) itemView.findViewById(R.id.post_name_text);
            main_category = (TextView) itemView.findViewById(R.id.post_category_text);
        }
    }

    public static class ProgressViewHolder extends RecyclerView.ViewHolder {
        public AVLoadingIndicatorView progressBar;

        public ProgressViewHolder(View v) {
            super(v);
            progressBar = (AVLoadingIndicatorView) v.findViewById(R.id.avloadingIndicatorView);
        }
    }
}

我从Adapter Class获取 CategoryID ,并将其与putExtra一起传递。

用于加载更多数据我使用接口类:OnLoadMoreListener

如何修复此错误,在帖子上滚动时,显示接下来的10个帖子! 注意:请不要给我负面的积分,帮助我,我真的需要你的帮助!谢谢所有&lt; 3我该如何解决?

1 个答案:

答案 0 :(得分:0)

我发现了我的问题!但我的问题很奇怪!我删除此代码:

mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
    @Override
    public void onLoadMore() {
        dataModels.add(null);
        mAdapter.notifyItemInserted(dataModels.size() - 1);
        LoadMoreData(catID, pageCount);
    }
});

再写一遍,解决我的问题!!!!这很奇怪:D。
希望能帮到你