Я создаю приложение для Android, которое имеет страницу комментариев пользователя, которая может содержать до 1000 комментариев. Это не будет хорошей практикой пытаться получить и загрузить все комментарии в recyclerView сразу. Итак, я хочу подход, который будет загружать комментарии в пакетном режиме, может быть по 10 за раз, и когда пользователь прокручивает recylcerView, он должен загрузить еще 10 и т. Д.
Проблема в том, что я использую Volley дляполучить комментарии как объекты JSON, и я не думаю, что у Volley есть пакетная обработка. Я также не уверен, что некоторые из страниц будут сделаны в моем PHP-файле. Я просмотрел несколько руководств на Youtube и проверил на переполнение стека ответы, включая Это и Это Но они не решают мою проблему.
Это мой PHPcode:
<?php
define('DB_HOST','*******');
define('DB_USER','********');
define('DB_PASS','********');
define('DB_NAME','***********');
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if(mysqli_connect_errno()){
die('Unable to connect to database '.mysqli_connect_error());
}
$conn->set_charset("utf8mb4");
$storyID = $_GET["storyid"];
$stmt = $conn->prepare("SELECT comments_table.comment_id, comments_table.username, comments_table.comment, comments_table.date_time, comments_table.story_id, comments_table.imageURL, comments_table.number_of_likes, users.title, comments_table.is_reply, comments_table.reply_username, comments_table.reply_comment, comments_table.reply_id FROM comments_table INNER JOIN users ON comments_table.username = users.username WHERE comments_table.story_id = '$storyID'");
$stmt->execute();
$stmt->bind_result($comment_id, $username, $comment, $date_time, $story_id, $imageURL, $number_of_likes, $title, $is_reply, $reply_username, $reply_comment, $reply_id);
$comments = array();
while($stmt->fetch()){
$temp = array();
$temp['comment_id'] = $comment_id;
$temp['username'] = $username;
$temp['comment'] = $comment;
$temp['date_time'] = $date_time;
$temp['story_id'] = $story_id;
$temp['imageURL'] = $imageURL;
$temp['number_of_likes'] = $number_of_likes;
$temp['title'] = $title;
$temp['is_reply'] = $is_reply;
$temp['reply_username'] = $reply_username;
$temp['reply_comment'] = $reply_comment;
$temp['reply_id'] = $reply_id;
array_push($comments, $temp);
}
echo json_encode($comments);
Это фрагмент кода, который я использовал при получении комментариев с помощью Volley:
private void loadComments() {
progressBar.setVisibility(View.VISIBLE);
StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_COMMENTS + String.valueOf(storyID),
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray array = new JSONArray(response);
for (int i = 0; i < array.length(); i++) {
JSONObject comment = array.getJSONObject(i);
if (comment.getInt("story_id") == storyID) {
commentList.add(new GetComments(
comment.getInt("comment_id"),
comment.getString("username"),
comment.getString("comment"),
comment.getInt("story_id"),
comment.getString("imageURL"),
comment.getString("date_time"),
comment.getInt("number_of_likes"),
comment.getString("title"),
comment.getInt("is_reply"),
comment.getInt("reply_id"),
comment.getString("reply_username"),
comment.getString("reply_comment")
));
}
}
if (commentList.isEmpty()){
noCommentTextView.setVisibility(View.VISIBLE);
}
//creating adapter object and setting it to recyclerview
adapterJSON = new CommentAdapter(getApplicationContext(), commentList, Comment.this, rootView, storyID);
recyclerView.setAdapter(adapterJSON);
} catch (JSONException e) {
progressBar.setVisibility(View.GONE);
Toast.makeText(Comment.this,"Error loading comments: Check internet connection...",Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressBar.setVisibility(View.GONE);
Toast.makeText(Comment.this,"Error loading comments: Check internet connection...",Toast.LENGTH_LONG).show();
}
});
final RequestQueue requestQueue = Volley.newRequestQueue(Comment.this);
requestQueue.add(stringRequest);
requestQueue.start();
requestQueue.addRequestFinishedListener(new RequestQueue.RequestFinishedListener<Object>() {
@Override
public void onRequestFinished(Request<Object> request) {
progressBar.setVisibility(View.GONE);
}
});
}
А это мои элементы recyclerView и layoutManager:
recyclerView = findViewById(R.id.recyclerView);
linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(linearLayoutManager);
Будем весьма благодарны за любые решения о том, как этого добиться или предложить правильный подход. Спасибо.