json parsing한 것을 recyclerview에서 30개씩 스크롤을 이용해서 보여주려고 하는데 질문입니다.


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 {

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();
        }
    }
}
  • 2016년 07월 22일에 작성됨
    지금 공익근무 중이고 안드로이드를 공부하고 있습니다.

조회수 257


1 답변


안드로이드에서 Infinite scrolling의 구현 방식에 대한 글 및 관련 라이브러리가 많이 존재하는 상태인데요. 이런 구현체들과 직접 구현한 방식을 비교하면서 아이디어를 얻거나 문제있는 부분을 찾을 수 있을 것 같습니다. 혹은 어느정도 검증된 라이브러리를 사용하는 것도 괜찮은 대안입니다. 아래의 관련 링크들을 살펴보세요.

유사한 질문과 답변의 해시코드 링크도 읽어보세요.


  • 감사합니다!!    kyudongPark   2016.7.26 17:37     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close