android - 从 JSON 分页文件 Android 在 AsyncTask 中加载第 2、3、4 页

标签 android json android-asynctask pagination

我有一个分页的 JSON 文件,其中包含我的所有数据。在我的 url 链接的末尾,如果您更改页码,它会执行并列出下一个项目,例如“?page=1”或“3,4,5,6”。

默认情况下,它保存在“?page=0”,这是在 Android 中解析时查看的第一个页面。

我还添加了一个带有按钮“L​​oadMore”的页脚 View ,该按钮显示在 ListView 的末尾。

现在,当我在第 1 页结束时,我希望这个 LoadMore 按钮在单击后转到第 2 页。当我单击第 2 页上的“加载更多”时,再次回到第 3 页。

我对实现它感到很困惑。这是我的异步任务。在“doInBackground”中做一些事情

  class LoadRestaurants extends AsyncTask<String, String, String> {

    //Show Progress Dialog
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(SearchAll.this);
        pDialog.setMessage("Loading All Restaurants...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    protected String doInBackground(String... arg) {
        //building parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        current_page = 0;

   URL_RESTAURANT_LIST 
   = "http://www.petuuk.com/android/allRestaurantList3.php?page=" + current_page;
        //Getting JSON from URL
        String json = jsonParser.makeHttpRequest(URL_RESTAURANT_LIST, "GET", params);

        //Log Cat Response Check
        Log.d("Areas JSON: ", "> " + json);

        try {
            restaurants = new JSONArray(json);

            if (restaurants != null) {
                //loop through all restaurants
                for (int i = 0; i < restaurants.length(); i++) {
                    JSONObject c = restaurants.getJSONObject(i);

                    //Storing each json  object in the variable.
                    String id = c.getString(TAG_ID);
                    String name = c.getString(TAG_NAME);
                    String location = c.getString(TAG_LOCATION);
                    String rating = c.getString(TAG_RATING);

                    //Creating New Hashmap
                    HashMap<String, String> map = new HashMap<String, String>();

                    //adding each child node to Hashmap key
                    map.put(TAG_ID, id);
                    map.put(TAG_NAME, name);
                    map.put(TAG_LOCATION, location);
                    map.put(TAG_RATING, rating);

                    //adding HashList to ArrayList
                    restaurant_list.add(map);
                }

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(String file_url) {

        //dismiss the dialog
        pDialog.dismiss();


        //Updating UI from the Background Thread
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                ListAdapter adapter = new SimpleAdapter(
                        SearchAll.this, restaurant_list,
                        R.layout.listview_restaurants, new String[]{
                        TAG_ID, TAG_NAME, TAG_LOCATION, TAG_RATING}, new int[]{
              R.id.login_id, R.id.restaurant_name, R.id.address, R.id.rating});

                setListAdapter(adapter);

                ListView lv = getListView();
                int currentPosition = lv.getFirstVisiblePosition();
                lv.setSelectionFromTop(currentPosition + 1, 1);

                lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
 public void onItemClick(AdapterView<?> parent, View view, int     position, long id) {

                        //  Bundle bundle = new Bundle();
           Intent intent = new Intent(getApplicationContext(),RestaurantProfile.class);
  String loginId = ((TextView) view.findViewById(R.id.login_id)).getText().toString();
  String res_name = ((TextView)
  view.findViewById(R.id.restaurant_name)).getText().toString();


                        intent.putExtra(TAG_ID, loginId);
                        intent.putExtra(TAG_NAME, res_name);

                        startActivity(intent);


                    }
                });

            }
        });


    }
}

这是我的加载更多按钮代码。

   Button btnLoadMore = new Button(SearchAll.this);
    btnLoadMore.setText("Show More");

    getListView().addFooterView(btnLoadMore);

    btnLoadMore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

        }
    });

我的 searchAll 文件,所有代码都放在这里。

 public class SearchAll extends ListActivity {

ConnectionDetector cd;
AlertDialogManager alert = new AlertDialogManager();

//Progress Dialog
private ProgressDialog pDialog;

//make json parser Object
JSONParser jsonParser = new JSONParser();

ArrayList<HashMap<String, String>> restaurant_list;

//Restaurant Json array
JSONArray restaurants = null;

private String URL_RESTAURANT_LIST
=   "http://www.petuuk.com/android/allRestaurantList3.php?page=0";

//all JSON Node Names
private static final String TAG_ID = "login_id";
private static final String TAG_NAME = "name";
private static final String TAG_LOCATION = "location";
private static final String TAG_RATING = "rating";

//Flag for current page
int current_page = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_all);

    cd = new ConnectionDetector(getApplicationContext());

    //Check for Internet Connection
    if (!cd.isConnectingToInternet()) {
        //Internet connection not present
        alert.showAlertDialog(SearchAll.this, "Internet Connection Error",
                "Please Check Your Internet Connection", false);
        //stop executing code by return
        return;
    }

    restaurant_list = new ArrayList<HashMap<String, String>>();
    new LoadRestaurants().execute();
    //new LoadRestaurants().execute();
    Button btnLoadMore = new Button(SearchAll.this);
    btnLoadMore.setText("Show More");

    getListView().addFooterView(btnLoadMore);

    btnLoadMore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new LoadMore().execute();
        }
    });


}


class LoadRestaurants extends AsyncTask<String, String, String> {

    //Show Progress Dialog
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(SearchAll.this);
        pDialog.setMessage("Loading All Restaurants...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    protected String doInBackground(String... arg) {
        //building parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();



        URL_RESTAURANT_LIST 
        = "http://www.petuuk.com/android/allRestaurantList3.php?page=0";
        //Getting JSON from URL
        String json = jsonParser.makeHttpRequest(URL_RESTAURANT_LIST, "GET", params);

        //Log Cat Response Check
        Log.d("Areas JSON: ", "> " + json);

        try {
            restaurants = new JSONArray(json);

            if (restaurants != null) {
                //loop through all restaurants
                for (int i = 0; i < restaurants.length(); i++) {
                    JSONObject c = restaurants.getJSONObject(i);

                    //Storing each json  object in the variable.
                    String id = c.getString(TAG_ID);
                    String name = c.getString(TAG_NAME);
                    String location = c.getString(TAG_LOCATION);
                    String rating = c.getString(TAG_RATING);

                    //Creating New Hashmap
                    HashMap<String, String> map = new HashMap<String, String>();

                    //adding each child node to Hashmap key
                    map.put(TAG_ID, id);
                    map.put(TAG_NAME, name);
                    map.put(TAG_LOCATION, location);
                    map.put(TAG_RATING, rating);

                    //adding HashList to ArrayList
                    restaurant_list.add(map);
                }

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(String file_url) {

        //dismiss the dialog
        pDialog.dismiss();


        //Updating UI from the Background Thread
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                ListAdapter adapter = new SimpleAdapter(
                        SearchAll.this, restaurant_list,
                        R.layout.listview_restaurants, new String[]{
                        TAG_ID, TAG_NAME, TAG_LOCATION, TAG_RATING}, new int[]{
               R.id.login_id, R.id.restaurant_name, R.id.address, R.id.rating});

                setListAdapter(adapter);

                ListView lv = getListView();
                int currentPosition = lv.getFirstVisiblePosition();
                lv.setSelectionFromTop(currentPosition + 1, 1);

                lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                        //  Bundle bundle = new Bundle();
       Intent intent = new Intent(getApplicationContext(),   RestaurantProfile.class);
  String loginId = ((TextView) view.findViewById(R.id.login_id)).getText().toString();
  String res_name =((TextView) view.findViewById
          (R.id.restaurant_name)).
  getText().toString();



                        intent.putExtra(TAG_ID, loginId);
                        intent.putExtra(TAG_NAME, res_name);

                        startActivity(intent);


                    }
                });

            }
        });


    }
}


private class LoadMore extends AsyncTask<Void, Void, Void> {

    //Show Progress Dialog


    @Override
    protected Void doInBackground(Void... voids) {
        //building parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        current_page = current_page + 1;

        URL_RESTAURANT_LIST 
        = "http://www.petuuk.com/android/allRestaurantList3.php?page=" + current_page;
        //Getting JSON from URL
        String json = jsonParser.makeHttpRequest(URL_RESTAURANT_LIST, "GET", params);

        //Log Cat Response Check
        Log.d("Areas JSON: ", "> " + json);

        try {
            restaurants = new JSONArray(json);

            if (restaurants != null) {
                //loop through all restaurants
                for (int i = 0; i < restaurants.length(); i++) {
                    JSONObject c = restaurants.getJSONObject(i);

                    //Storing each json  object in the variable.
                    String id = c.getString(TAG_ID);
                    String name = c.getString(TAG_NAME);
                    String location = c.getString(TAG_LOCATION);
                    String rating = c.getString(TAG_RATING);

                    //Creating New Hashmap
                    HashMap<String, String> map = new HashMap<String, String>();

                    //adding each child node to Hashmap key
                    map.put(TAG_ID, id);
                    map.put(TAG_NAME, name);
                    map.put(TAG_LOCATION, location);
                    map.put(TAG_RATING, rating);

                    //adding HashList to ArrayList
                    restaurant_list.add(map);
                }

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(Void unused) {
        // closing progress dialog
        pDialog.dismiss();
    }
}
    }

最佳答案

终于成功了!

public class SearchAll extends ListActivity {

ConnectionDetector cd;
AlertDialogManager alert = new AlertDialogManager();

//Progress Dialog
private ProgressDialog pDialog;

//make json parser Object
JSONParser jsonParser = new JSONParser();

ArrayList<HashMap<String, String>> restaurant_list;

//Restaurant Json array
JSONArray restaurants = null;

private String URL_RESTAURANT_LIST 
= "http://www.petuuk.com/android/allRestaurantList3.php?page=0";

//all JSON Node Names
private static final String TAG_ID = "login_id";
private static final String TAG_NAME = "name";
private static final String TAG_LOCATION = "location";
private static final String TAG_RATING = "rating";

//Flag for current page
//   int current_page = 1;
int bCount = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_all);

    cd = new ConnectionDetector(getApplicationContext());

    //Check for Internet Connection
    if (!cd.isConnectingToInternet()) {
        //Internet connection not present
        alert.showAlertDialog(SearchAll.this, "Internet Connection Error",
                "Please Check Your Internet Connection", false);
        //stop executing code by return
        return;
    }

    restaurant_list = new ArrayList<HashMap<String, String>>();
    new LoadRestaurants().execute();
    //new LoadRestaurants().execute();
    Button btnLoadMore = new Button(SearchAll.this);
    btnLoadMore.setText("Show More");

    getListView().addFooterView(btnLoadMore);

    btnLoadMore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            bCount++;
            new LoadRestaurants().execute();
        }
    });


}


class LoadRestaurants extends AsyncTask<String, String, String> {

    //Show Progress Dialog
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(SearchAll.this);
        pDialog.setMessage("Loading All Restaurants...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    protected String doInBackground(String... arg) {
        //building parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();



        URL_RESTAURANT_LIST 
         = "http://www.petuuk.com/android /allRestaurantList3.php?page=
        " + bCount;
        //Getting JSON from URL

        String json = jsonParser.makeHttpRequest(URL_RESTAURANT_LIST, "GET", params);

        //Log Cat Response Check
        Log.d("Areas JSON: ", "> " + json);

        try {
            restaurants = new JSONArray(json);

            if (restaurants != null) {
                //loop through all restaurants
                for (int i = 0; i < restaurants.length(); i++) {
                    JSONObject c = restaurants.getJSONObject(i);

                    //Storing each json  object in the variable.
                    String id = c.getString(TAG_ID);
                    String name = c.getString(TAG_NAME);
                    String location = c.getString(TAG_LOCATION);
                    String rating = c.getString(TAG_RATING);

                    //Creating New Hashmap
                    HashMap<String, String> map = new HashMap<String, String>();

                    //adding each child node to Hashmap key
                    map.put(TAG_ID, id);
                    map.put(TAG_NAME, name);
                    map.put(TAG_LOCATION, location);
                    map.put(TAG_RATING, rating);

                    //adding HashList to ArrayList
                    restaurant_list.add(map);
                }

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(String file_url) {

        //dismiss the dialog
        pDialog.dismiss();


        //Updating UI from the Background Thread
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                ListAdapter adapter = new SimpleAdapter(
                        SearchAll.this, restaurant_list,
                        R.layout.listview_restaurants, new String[]{
                        TAG_ID, TAG_NAME, TAG_LOCATION, TAG_RATING}, new int[]{
                 R.id.login_id, R.id.restaurant_name, R.id.address, R.id.rating});

                setListAdapter(adapter);

                ListView lv = getListView();
                int currentPosition = lv.getFirstVisiblePosition();
                lv.setSelectionFromTop(currentPosition + 1, 1);

                lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                        //  Bundle bundle = new Bundle();
Intent intent = new Intent(getApplicationContext(), RestaurantProfile.class);
String loginId = ((TextView) view.findViewById(R.id.login_id)).getText().toString();
String res_name = ((TextView) view.findViewById(R.id.restaurant_name))
 .getText().toString();


                        intent.putExtra(TAG_ID, loginId);
                        intent.putExtra(TAG_NAME, res_name);

                        startActivity(intent);


                    }
                });

            }
        });


    }
}
}

关于android - 从 JSON 分页文件 Android 在 AsyncTask 中加载第 2、3、4 页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25594153/

相关文章:

java - 使用 Room Entity 返回列表包含整数而不是预期类型

json - 如何使用 PowerShell V2 使用 Websocket 客户端打开与 URL 的长期连接?

android - 使用 tcp 套接字连接 android 模拟器

android - java.lang.RuntimeException : An error occured while executing doInBackground() with jsoup 错误

json - 选择特定字段并从 jsonb 字段中的数组获取结果

Android - setSoTimeout 不工作

android - 从 Android 中的图像创建视频文件

android - Kotlin + Room : java. lang.IllegalArgumentException:void 无法转换为 Element

java - Android Tablayout,为什么标签不移动?

javascript - Flickr Json 调用 API