当前位置: 首页 > 知识库问答 >
问题:

如何用大型json数据填充RecyclerView[duplicate]

习华灿
2023-03-14

我有一个返回JSON对象的REST方法,JSON文件大小差不多有7MB,有差不多4600个JSON对象。我无法一次将整个数据解析到recyclerView中,因为这会导致OutOfMemory异常。

我在这里面临的问题是recyclerview显示的ROLL_NUM、CURRENT_CLASS、STUDENT_NAME的值为空

示例JSON响应:{“RESTRESULT”:[{“”ROLL_NUM“:7071,”CURRENT_CLASS“:”GRADE LKG C“,”STUDENT_NAME“:”A.VEDANJALI AKULA VEDANJALI“}

ListItem.Class

String STUDENT_NAME;

String CURRENT_CLASS;

String ROLL_NUMBER;

public String getSTUDENT_NAME() {
    return STUDENT_NAME;
}

public String getCURRENT_CLASS() {
    return CURRENT_CLASS;
}

public String getROLL_NUMBER() {
    return ROLL_NUMBER;
}

public GetSet(String STUDENT_NAME, String CURRENT_CLASS, String ROLL_NUMBER) {
    this.STUDENT_NAME = STUDENT_NAME;
    this.CURRENT_CLASS = CURRENT_CLASS;
    this.ROLL_NUMBER = ROLL_NUMBER;
}

RecyclerAdapter.Class

 private List<GetSet> itemList;
private Context context;

public RecyclerViewAdapter(Context context, List<GetSet> itemList) {
    this.itemList = itemList;
    this.context = context;
}

@Override
public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, null);
    RecyclerViewHolders rcv = new RecyclerViewHolders(layoutView);
    return rcv;
}

@Override
public void onBindViewHolder(RecyclerViewHolders holder, int position) {
    holder.songTitle.setText("Student Name: " + itemList.get(position).getSTUDENT_NAME());
    holder.songYear.setText("Current Class: " + itemList.get(position).getCURRENT_CLASS());
    holder.songAuthor.setText("Roll Number: " + itemList.get(position).getROLL_NUMBER());
}

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

ActivityMain.Class

RequestQueue queue = Volley.newRequestQueue(this);
    String url ="http://webservices.educatemax.com/vidyaMandir.svc/RetrieveStudentsList?iGroupID=1&iSchoolID=1&iBoardID=1&iClassID=1";
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            progressDialog.hide();
            Log.d(TAG, "Response " + response);
            GsonBuilder builder = new GsonBuilder();
            Gson mGson = builder.create();
            List<GetSet> posts = new ArrayList<>();


            posts = Arrays.asList(mGson.fromJson(response, GetSet.class));
            adapter = new RecyclerViewAdapter(ActivityMain.this, posts);
            recyclerView.setAdapter(adapter);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d(TAG, "Error " + error.getMessage());
        }
    });
    queue.add(stringRequest);

共有1个答案

金飞翼
2023-03-14

您可以使用如下所示的滚动监听器:

public abstract class RecyclerViewOnScrollListener extends RecyclerView.OnScrollListener {
private final int mVisibleThreshold = 1;
private int mPreviousTotal = 0;
private boolean isLoading = true;
private int mFirstVisibleItem;
private int mVisibleItemsCount;
private int mTotalItemsCount;

private int mCurrentPage = 0;
private LinearLayoutManager mLayoutManager;

public RecyclerViewOnScrollListener(LinearLayoutManager manager) {
    this.mLayoutManager = manager;
}

public void init() {
    this.mPreviousTotal = 0;
    this.isLoading = true;
    this.mCurrentPage = 0;
}

@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);

    mVisibleItemsCount = recyclerView.getChildCount();
    mTotalItemsCount = mLayoutManager.getItemCount();
    mFirstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();

    if (isLoading && mTotalItemsCount > mPreviousTotal) {
        isLoading = false;
        mPreviousTotal = mTotalItemsCount;
    }
    if (!isLoading && (mTotalItemsCount - mVisibleItemsCount) <= (mFirstVisibleItem + mVisibleThreshold)) {
        mCurrentPage = mCurrentPage + 10;
        onLoadMore(mCurrentPage);
        isLoading = true;
    }
}

public abstract void onLoadMore(int currentPage);
}

并且在您的碎片活动中(任何地方您有您的recyclerView):

        mRecyclerOnScrollListener = new RecyclerViewOnScrollListener(new GridLayoutManager(MyActivity.this, getResources().getInteger(R.integer.num_columns))) {
        @Override
        public void onLoadMore(int currentPage) {
            //here you can manage content and add to your adaprer 
        }
    };
 类似资料:
  • 所以我用Java处理这些数据: 我需要将其转换为JSON: 但是我不知道怎么做。 目前我认为这是最好的方法: 但我不确定如何使用Hashmap实现这一点。我知道是这样的: 但确切的语法,以及如何将其与其他数据一起添加,我无法计算。有什么想法吗?

  • 问题内容: 我一直在尝试使用从数据库查询的数据加载TableView,但似乎无法使其正常工作。 这是我第一次尝试用数据库查询项填充数据库的情况,以防我的代码看起来杂乱无章,而且效果不佳。 FXML是通过JavaFx SceneBuilder完成的。 这是数据库查询类: 这是通过JavaFx场景生成器生成的FXML脚本: 问题答案: 这是将数据从数据库填充到tableView的最佳解决方案。 这是参

  • 问题内容: 建议使用JQuery数据表。现在,我需要用从控制器发送的一堆json对象填充网格。我如何从JS在网格上发送此数据 更新 我已经找到了这些链接,但是我不知道如何实现它。 问题答案: 您应该使用JQuery DataTable sAjaxSource属性来指定ajaxsource,在这种情况下,它将是/ HomeReturnJsonData 以下是一个例子

  • 问题内容: 我正在开发一个国家/地区级联下拉列表…我基于返回了json结果,但我不知道如何在新的下拉列表框中填充/填充它。 这是我正在使用的 警报给了这个 我的aspx页面上有这个 关于如何填充下拉菜单的任何建议… 编辑: 当我通过萤火虫检查时,我收到了有关ajax帖子的回复, 问题答案: 例

  • series(string $value,[ string $categories]) string $value $config = ['path' => './tests']; ​ $fileObject = new \Vtiful\Kernel\Excel($config); ​ $fileObject = $fileObject->fileName('tutorial.xlsx'); $