편집 기록

편집 기록
  • 프로필 nowp님의 편집
    날짜2021.12.27

    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<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();
                }
            }
        }
    
  • 프로필 kyudongPark님의 편집
    날짜2016.07.22

    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();
            }
        }
    }