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