json parsing한 것을 recyclerview에서 30개씩 스크롤을 이용해서 보여주려고 하는데 질문입니다.
조회수 5254회
Asynctask를 이용해서 url로 값을 post해서 보내면 json 데이터를 받아오게 해서 그걸 recyclerview에다가 나타냅니다. 0을 post하면 0~30의 데이터, 30을 post하면 30~60의 데이터 ... 이런 식으로 천 개의 데이터를 받아와야 하는데 recyclerview에서 처음에는 0~30의 데이터가 보이고 스크롤이 맨 밑으로 내려가면 30~60, 또 맨 밑으로 내려가면 60~90 이런식으로 보여주려고 합니다.
현재 post 0 을 해서 recyclerview에 0~30의 데이터를 보여주기는 했습니다. 근데 스크롤이 밑으로 내려갔을 때 어떤식으로 짜야 하는지 도저히 모르겠어요. 도와주세요. 뷰홀더랑 아이템은 따로 올리지 않았습니다.
recyclerview adapter는 이렇습니다.
public class SampleItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList<SampleItem> sampleItemList;
private Context context;
public SampleItemAdapter(Context context, ArrayList<SampleItem> sampleItemList) {
this.context = context;
this.sampleItemList = sampleItemList;
}
@Override
public int getItemCount() {
return this.sampleItemList.size();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View sampleItemLayout = LayoutInflater.from(parent.getContext()).inflate(
R.layout.recycleview_menu, parent, false);
return new SampleItemViewHolder(sampleItemLayout);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
((SampleItemViewHolder) holder).sunwi.setText(sampleItemList.get(position).sunwi);
((SampleItemViewHolder) holder).id.setText(sampleItemList.get(position).id);
((SampleItemViewHolder) holder).clan.setText(sampleItemList.get(position).clan);
Picasso.with(context).load(sampleItemList.get(position).getAndroid_image_url()).resize(100, 100).into(((SampleItemViewHolder) holder).image);
}
@Override
public int getItemViewType(int position) {
return position;
}
}
메인은 이렇습니다.
public class MainActivity extends Activity {
RecyclerView rv;
LinearLayoutManager layoutManager;
SampleItemAdapter adapter;
ArrayList<SampleItem> sampleItemList = new ArrayList<>();
private int previousTotal = 0;
private boolean loading = true;
private int visibleThreshold = 0;
int firstVisibleItem, visibleItemCount, totalItemCount;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv = (RecyclerView) findViewById(R.id.rv);
new JsonAsyncTask().execute("받아오는 url");
}
public class JsonAsyncTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
try {
URL url = new URL(params[0]);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
OutputStream outputStream = conn.getOutputStream();
JSONObject postJsonObject = new JSONObject();
postJsonObject.put("value", 0);
outputStream.write(postJsonObject.toString().getBytes());
outputStream.flush();
int response_code = conn.getResponseCode();
if(response_code == HttpURLConnection.HTTP_OK) {
InputStream inputstream = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream));
StringBuffer buffer = new StringBuffer();
String line = "";
while((line = reader.readLine()) != null) {
buffer.append(line);
}
String jsonbuffer = buffer.toString();
return jsonbuffer;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
try {
JSONObject parentJsonObject = new JSONObject(result);
JSONArray parentJsonArray = parentJsonObject.getJSONArray("userData");
for(int i = 0; i<parentJsonArray.length(); i++) {
JSONObject childJsonObject = parentJsonArray.getJSONObject(i);
SampleItem sampleItem = new SampleItem();
sampleItem.sunwi = "" + (i+1);
sampleItem.id = childJsonObject.getString("name");
sampleItem.clan = childJsonObject.getString("clan");
int clan_id = childJsonObject.getInt("clan_id");
String clan = childJsonObject.getString("clan");
if(clan == null) {
sampleItem.clan = "";
} else {
sampleItem.clan = childJsonObject.getString("clan");
}
sampleItemList.add(sampleItem);
}
adapter = new SampleItemAdapter(MainActivity.this, sampleItemList);
rv.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(MainActivity.this);
rv.setLayoutManager(layoutManager);
rv.addItemDecoration(new SimpleDividerItemDecoration(getApplicationContext()));
rv.setAdapter(adapter);
rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = rv.getChildCount();
totalItemCount = layoutManager.getItemCount();
firstVisibleItem = layoutManager.findFirstVisibleItemPosition();
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleItemCount)
<= (firstVisibleItem + visibleThreshold)) {
// End has been reached
Log.i("Yaeye!", "end called");
// Do something
loading = true;
}
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
}
1 답변
-
안드로이드에서 Infinite scrolling의 구현 방식에 대한 글 및 관련 라이브러리가 많이 존재하는 상태인데요. 이런 구현체들과 직접 구현한 방식을 비교하면서 아이디어를 얻거나 문제있는 부분을 찾을 수 있을 것 같습니다. 혹은 어느정도 검증된 라이브러리를 사용하는 것도 괜찮은 대안입니다. 아래의 관련 링크들을 살펴보세요.
- http://www.avocarrot.com/blog/implement-infinitely-scrolling-list-android/
- https://github.com/codepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews-and-RecyclerView
- https://gist.github.com/polbins/b6830d392e5c687c8e77
- https://github.com/vinaysshenoy/mugen
- https://github.com/cymcsg/UltimateRecyclerView
- https://github.com/pwittchen/InfiniteScroll
유사한 질문과 답변의 해시코드 링크도 읽어보세요.
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력