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 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)