0

リモート Web サーバー上の MySql データベースからデータを取得する Android アプリを作成しました。情報が解析され、リストビューに表示されます。リストビューには、アクティビティを遅くする可能性のある画像も表示されます。どうすればアイテム 0 ~ 9 しか表示できないのだろうと思っていましたが、ボタンをクリックすると 10 ~ 19 が表示されます。「do until」を使用してVBで実行できますが、Android/Javaに関しては、ちょっと迷っています。どんな助けでも大歓迎です。

以下は、それを実装する必要があるクラスです。整数を追加してカウントを保持し、配列をループして「整数」にカウントを追加する前に「DO UNTIL」の形式を実装する必要があると思いますが、ここでそれを行う方法がわかりません。

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

    @Override
    protected String doInBackground(String... file_url) {
        // TODO Auto-generated method stub

        try{
            //Settings to send to PHP
            List<NameValuePair> settings = new ArrayList<NameValuePair>();
            //Adding Search Criteria(Keyword) to settings
            settings.add(new BasicNameValuePair("product", product));

            //Getting JSON result from request
            JSONObject jObject = jParser.makeHttpRequest(url_to_php, "GET", settings);

            //Display JSON in LogCat
            Log.d("Product Search", jObject.toString());

            //Get Result 
            int result = jObject.getInt(KEY_RESULT);

            //If Result Equals 1 then
            if(result==1){
                //Getting the KEY_PRODUCTS
                products = jObject.getJSONArray(KEY_PRODUCTS);

                //Loop through Array

                for(int i = 0; i < products.length();i++){
                    JSONObject x = products.getJSONObject(i);

                    String proPid = x.getString(KEY_PRODID);
                    String name = x.getString(KEY_NAME);
                    String price = x.getString(KEY_PRICE);
                    String desc = x.getString(KEY_DESCRIPTION);
                    String img = x.getString(KEY_IMAGE);
                    // creating new HashMap
                    HashMap<String, String> hmap = new HashMap<String, String>();
                    hmap.put(KEY_PRODID, proPid);
                    hmap.put(KEY_NAME, name);
                    hmap.put(KEY_PRICE, price);
                    hmap.put(KEY_DESCRIPTION, desc);
                    hmap.put(KEY_IMAGE, img);

                    //Hash to ArrayList
                    myproducts.add(hmap);
}

            } else {


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

        return null;
    }
4

1 に答える 1

0

アプリでページネーションを作成する代わりに、サーバーに任せるべきです。

サーバーでリクエストを受け取る方法を変更して、サーバーを呼び出すときに、行をフェッチする開始インデックスと、各リクエストでフェッチする行数をポストする必要があります。

したがって、サーバーへの URL は次のようになります。

http://example.com/myjsonrequest.php?startindex=10&numofrows=10

サーバー上の PHPselectステートメントで、次のように、必要な行のみを選択するように変更します。

SELECT * FROM my_table LIMIT $startindex, $numofrows;

もちろん、SQL インジェクションをチェックすることを忘れないでください。

この方法では、一度にすべてのデータを取得するのではなく、実際に必要なデータのみを取得します。アプリはモバイル OS 上にあり、インターネット接続が不安定な場合があることを覚えておいてください。そのため、返されるデータが増加している場合、すべてのデータが読み込まれるのを待つのはユーザーの観点からは好ましくありません。 、特にその一部がまだ必要でない場合。

たとえば、たとえば 1000 行のデータが返された場合、モバイル インターネット接続を介してフェッチするには時間がかかります。

限られた量のエントリのみを受け取った後JSonObject、返されたエントリの数を追跡せずに解析できるようになりました。

Android アプリ内で追跡する必要があるのは、ユーザーがこれまでに参照したデータベース内のインデックスだけであり、ユーザーが新しいページを取得するたびにこのカウンターをインクリメントします。

于 2013-06-29T22:15:30.207 に答える