Как загрузить больше элементов в ListView, используя AsyncTask или любой другой метод
Я очень плохо знаком с разработкой Android и знаю, что на этот вопрос можно было ответить раньше, но я не могу найти подходящий ответ для своей ситуации. Я создаю приложение для Android, которое имеетListView
показать список предметов. Мне нужно показать больше элементов (например, еще 10), когда пользователь достигает нижнего колонтитулаListView
, Я реализовалsetOnScrollListener()
, Моя единственная проблема, для которой мне нужно ваше руководство, заключается в том, как я могу получить больше предметов, когда пользователь достигает нижней частиListView
, Должен ли я создать другойAsyncTask
для этого? Если да, то как я могу добиться этого ... В настоящее время я показываю 10 предметов, и я получаю эти предметы через API вJSON
формат с использованиемAsyncTask
, Ниже приведен код для этогоAsyncTask
.
public class GetRecipeData extends AsyncTask<Object, Void, JSONObject> {
public final int NUMBER_OF_POSTS = 10;
int responseCode = -1;
JSONObject recipeJsonResponse = null;
@Override
protected JSONObject doInBackground(Object... params) {
try {
URL blogFeedUrl = new URL("http://www.bestfoodrecipesever.com/api/get_category_posts/?slug="+RECIPE_CAT+"&count="+NUMBER_OF_POSTS);
HttpURLConnection connection = (HttpURLConnection) blogFeedUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK){
InputStream inputStream = connection.getInputStream();
StringBuffer buffer = new StringBuffer();
if (inputStream == null) {
// Nothing to do.
return null;
}
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
// Since it's JSON, adding a newline isn't necessary (it won't affect parsing)
// But it does make debugging a *lot* easier if you print out the completed
// buffer for debugging.
buffer.append(line + "\n");
}
if (buffer.length() == 0) {
// Stream was empty. No point in parsing.
return null;
}
String recipeDataJsonStr = buffer.toString();
recipeJsonResponse = new JSONObject(recipeDataJsonStr);
}else {
Log.i(LOG_TAG, "Unsuccessful HTTP Response Code: " + responseCode);
}
}
catch (MalformedURLException e){
Log.e(LOG_TAG,"Exception Caught: ",e);
}
catch (IOException e) {
Log.e(LOG_TAG, "IO Exception Caught: ",e);
}
catch (Exception e) {
Log.e(LOG_TAG,"Exception Caught: ",e);
}
return recipeJsonResponse;
}
@Override
protected void onPostExecute(JSONObject result) {
super.onPostExecute(result);
mRecipeData = result;
handleRecipeData();
}
}
Вот код дляhandleRecipeData()
Метод:
private void handleRecipeData() {
mProgressBar.setVisibility(View.INVISIBLE);
if(mRecipeData == null){
handleErrors();
}else {
try {
getRecipeData();
} catch (JSONException e) {
Log.e(LOG_TAG,"Exception Caught: ",e);
}
}
}
А вот код дляgetRecipeData()
Метод, который используется в рамкахhandleRecipeData()
Метод:
private void getRecipeData() throws JSONException {
JSONArray jsonPosts = mRecipeData.getJSONArray("posts");
mRecipePostData = new ArrayList<>();
for (int i = 0; i < jsonPosts.length(); i++){
JSONObject post = jsonPosts.getJSONObject(i);
String title = post.getString(KEY_TITLE);
title = Html.fromHtml(title).toString();
String author = post.getJSONObject(KEY_AUTHOR).getString("name");
author = Html.fromHtml(author).toString();
String imgUrl = post.getJSONObject(KEY_IMG_URL).getJSONObject("full").getString("url");
String recipeContent = post.getString(KEY_CONTENT);
recipeContent = Html.fromHtml(recipeContent).toString();
String recipeUrl = post.getString(KEY_RECIPE_URL);
HashMap<String, String> singleRecipePost = new HashMap<>();
singleRecipePost.put(KEY_TITLE, title);
singleRecipePost.put(KEY_AUTHOR, author);
singleRecipePost.put(KEY_IMG_URL, imgUrl);
singleRecipePost.put(KEY_CONTENT, recipeContent);
singleRecipePost.put(KEY_RECIPE_URL, recipeUrl);
mRecipePostData.add(singleRecipePost);
}
String[] keys = {KEY_TITLE};
int[] ids = {R.id.list_recipe_title};
mRecipeAdapter = new ExtendedSimpleAdapter(getContext(), mRecipePostData, R.layout.itemlistrow, keys, ids);
listView.setAdapter(mRecipeAdapter);
mRecipeAdapter.notifyDataSetChanged();
}
Я действительно застрял в этой проблеме ... Может кто-нибудь помочь мне с этим ... Я был бы вам благодарен.
Я также создал специальный адаптер ExtendedSimpleAdapter. Вот код для этого адаптера. В случае, если кто-то захочет просмотреть его:
public class ExtendedSimpleAdapter extends SimpleAdapter {
Context context2;
public ExtendedSimpleAdapter(Context context, List<? extends Map<String, String>> data, int resource, String[] from, int[] to){
super(context, data, resource, from, to);
context2=context;
}
public View getView(int position, View convertView, ViewGroup parent){
// here you let SimpleAdapter built the view normally.
View v = super.getView(position, convertView, parent);
// Then we get reference for Picasso
//TextView recipeTitle = (TextView) v.getTag();
ImageView recipeThumb = (ImageView) v.getTag();
if(recipeThumb == null){
//recipeTitle = (TextView) v.findViewById(R.id.list_recipe_title);
recipeThumb = (ImageView) v.findViewById(R.id.list_recipe_thumb);
//v.setTag(recipeTitle);
v.setTag(recipeThumb); // <<< THIS LINE !!!!
}
// get the url from the data you passed to the `Map`
String TAG_IMAGE = "thumbnail_images";
String url = ((Map<String,String>) getItem(position)).get(TAG_IMAGE);
// do Picasso
// maybe you could do that by using many ways to start
Picasso.with(context2).load(url).resize(300, 200).centerCrop().into(recipeThumb);
// return the view
return v;
}
}
заранее спасибо