2017-06-15 67 views
-1

我有一个返回JSON对象的REST方法,JSON文件大小几乎重7MB,并且有近4600个JSON对象。我无法一次将整个数据解析到recyclerView中,因为它会导致OutOfMemory异常。如何使用大json数据填充RecyclerView

我试图用两种方式实现它。一种是使用http://loopj.com/android-async-http/,但这种方法不适用于大块数据。第二种方法是使用GSON和Volley完成的。使用这种方法,我能够从REST方法获得更快的响应,但我无法将其填充到recyclerView中。请检查我使用的代码。

的问题,即我面对这里是recyclerview示出了用于ROLL_NUM,CURRENT_CLASS空值,STUDENT_NAME

样品JSON响应:{ “RestResult”:[{ “” ROLL_NUM “:7071,” CURRENT_CLASS“: “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); 
+0

使用分页 –

回答

0

试试这个来实现分页中recyclerview这样创造网页服务根据分页要求

private boolean loading = true; 
    int pastVisiblesItems, visibleItemCount, totalItemCount; 

    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() 
{ 
    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) 
    { 
     if(dy > 0) //check for scroll down 
     { 
      visibleItemCount = mLayoutManager.getChildCount(); 
      totalItemCount = mLayoutManager.getItemCount(); 
      pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition(); 

      if (loading) 
      { 
       if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) 
       { 
        loading = false; 
        Log.v("...", "last element of recyclerview !"); 
        //Do pagination.. and fetch new data from here 
       } 
      } 
     } 
    } 
}); 
0

您可以使用滚动监听器是这样的:

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)的活动: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 
     } 
    };