7

私はAndroidにまったく慣れておらず、現在サーバーから取得したJSON配列からリストビューを生成しようとしています。運が悪かったチュートリアルをたくさん読んだことがあります。これを行うには、独自の方法があります。始めに良いリソースをいくつか教えてください。

私はこのページを読みましたが、次のコードで立ち往生しています:

import josecgomez.com.android.dev.webservice.objects.alerts;

識別されたリソースがないため、「」を指定します。

public class AlertsAdapter extends ArrayAdapter<alerts>

ありがとう、どんな助けでも大歓迎です!

4

5 に答える 5

18

JSONlistviewこのように動作します..

1.アイテム一覧表示

Android SDK は、android.app.ListActivity というスーパークラスを使用して、データのリストをすばやく表示する便利な方法を提供します。このアクティビティは、 で構成された ContentView を既に提供しておりListView、すぐに使用してデータを取り込むことができます。

ListView には、表示するデータと、そのデータを行にマップする手段を指定する必要があります。ListAdaptor はこのメカニズムを提供し、setListAdaptor を使用して ListActivity の基になる ListView に設定されます。

(ArrayAdaptor)任意のデータの配列を処理する方法を認識しているAndroid SDK 提供のアダプター(Android SDK には、ローカル データ ストレージを ListView に接続するときに役立つカーソル アダプターなど、ListViews他のいくつかの も付属しています)。ListAdaptorsまた、要素を各行にレンダリングするために使用できるレイアウトをアダプターに提供する必要があります。以下の例では、Android SDK が提供するレイアウト simple_list_item_1 を使用しています。これは単一のテキスト ラベルであり、単一の文字列を配置するのに最適です。

String[] elements = {"Line 1", "Line 2"};
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, elements));

2.各リスト項目の外観をカスタマイズする

これを実現するには、組み込みのレイアウトと ArrayAdaptor を超えて、代わりに独自のものを実装する必要があります。

作成者とコンテンツの両方を文字列として保持するために使用できるクラス ABC を作成することから始めます。次に、オブジェクトを作成して、カスタム リスト項目に表示されるテスト データを入力します。

public class ABC {
    String userId;
    String pwd;
}

でレイアウト XML ファイルを作成して、コンテンツと作成者を別々の行に表示/res/layout/list_item.xmlする 2 つを定義します。TextViewsそれらを上下に表示するには、その中の各要素を垂直にレンダリングするように構成された LinearLayout を使用します(android:orientation="vertical")

XML ファイルが作成されると、Android Eclipse プラグインはそれを参照として生成された R ファイルに自動的に追加します。この R ファイルは、プロジェクトの /gen フォルダーの下に保持され、XML 要素と Java コードの間のブリッジとして機能します。これにより、Java コードで、/res フォルダーの下に作成された XML 要素とファイルを参照できるようになります。作成したばかりのファイルはR.layout.list_item、次にカスタム リスト アダプターで行うように、Java コードと同じように参照できるようになりました。

ListAdaptorwhich subclassesというプライベート クラスを (Activity 内に) 作成しますArrayAdaptor。このクラスは、表示されている ArrayList を格納するために使用する必要がありますTextViews。また、上記のレイアウトで作成した にオブジェクトをマップする方法を提供する必要があります。

このマッピングは ListAdaptor をオーバーライドし、要求された位置にあるデータの内容が取り込まれた View オブジェクトを返す必要があります。

カスタム abcListAdaptor の完全な実装は次のとおりです。

private class abcListAdaptor extends ArrayAdapter<abc> {  
    private ArrayList<abc> abc;  
    public abcListAdaptor(Context context, int textViewResourceId, ArrayList<abc> items) {  
        super(context, textViewResourceId, items);  
        this.abc = items;  
    }  

    @Override  
    public View getView(int position, View convertView, ViewGroup parent) {  
        View v = convertView;  

        if (v == null) {  
            LayoutInflater vi = (LayoutInflater) getSystemService                          
(Context.LAYOUT_INFLATER_SERVICE);  
            v = vi.inflate(R.layout.list_item, null);  
        }  

        abc o = abc.get(position);  
        TextView tt = (TextView) v.findViewById(R.id.uid);  
        TextView bt = (TextView) v.findViewById(R.id.pwd);  
        tt.setText(o.userid);  
        bt.setText(o.pwd);  
        return v;  
    }  
}  

以下に示すように、作成されたテスト データでカスタム リスト アダプターを使用するように onCreate メソッドを調整できます。

public void onCreate(Bundle savedInstanceState) {  
super.onCreate(savedInstanceState);  
abc a = new abc();  
a.userid = "tech";  
a.pwd = "android";  
ArrayList<abc> items = new ArrayList<abc>();  
items.add(a);  
abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, items);  
setListAdapter(adaptor);  
}  

3.リモートサービスへのアクセスとデータの解析

Android SDK には、HTTP ベースの API へのアクセスを簡素化することを目的としたパッケージが含まれています。Apache HTTP クラスが含まれており、org.apache.http package. これらのクラスをクラスと共に使用してorg.json、サーバーから返されるデータを解析します。

ArrayListリクエストを行い、結果を解析し、オブジェクトの を返すアクティビティでプライベート メソッドを作成できます。以下にリストされているコードは、リクエストを作成し、結果の を探しJSON arrayます。これは、各テキストと from_user 要素を抽出するために繰り返されます。

ArrayList<abc> getDetail= new ArrayList<abc>();  
    try {  
        HttpClient hc = new DefaultHttpClient();  
        HttpGet get = new  
        HttpGet("<a href="http://your URL"></a>");  
        HttpResponse rp = hc.execute(get);  

        if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
            String result = EntityUtils.toString(rp.getEntity());  
            JSONObject root = new JSONObject(result);  
            JSONArray sessions = root.getJSONArray("results");  

            for (int i = 0; i < sessions.length(); i++) {  
                JSONObject session = sessions.getJSONObject(i);  
                abc a = new abc();  
                a.uid = session.getString("user");  
                a.pwd = session.getString("password");  
                getDetail.add(a);  
            }  
        }  
    } 

    catch (Exception e) {  
        Log.e("Activity", "Error loading JSON", e);  
    }  

次に、onCreate メソッドでカスタム リスト アダプターを構築するときに、以前に使用したダミー データを load メソッドの呼び出しに置き換えます。

abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, load());  

4.レスポンシブ ユーザー インターフェイスの作成

コードが現在の状態であると、アプリケーションが応答しない (ANR) ダイアログが表示され、ユーザーにアプリを終了するよう促す可能性があります。これは、 などのメソッド内で実行されるデータのリモート リクエストを作成する作業が長時間実行されるために発生する可能性がありますonCreate

実行時間の長いタスクは、メイン アプリケーション スレッド (ユーザー インターフェイス イベント ループを駆動するスレッド) で実行しないでください。代わりに、作業を実行するために子スレッドに生成する必要があります。

Java のThreadクラスをこのタスクに使用できますが、長時間実行されるタスクが完了すると、一般にユーザー インターフェイスを変更して結果を報告する (つまり、要求から読み込まれたのリストを表示する) 必要があるという複雑な問題があります。 .

Android UI ツールキットはスレッドセーフではないため、ユーザー インターフェイス要素の状態はメイン スレッドからのみ変更できます。そのため、バックグラウンド スレッドは UI を操作するためにメイン スレッドにメッセージを返す必要があります。

ありがたいことに、Android SDK には便利なクラス AsyncTask が用意されています。これは、非同期タスクが UI スレッドと安全に対話するための簡単なメカニズムを提供します。これは、AsyncTask をサブクラス化し、doInBackground メソッドをオーバーライドして実行時間の長いタスクを実行し、次に onPostExecute をオーバーライドして UI で操作を実行することによって実現されます。

AsyncTask が作成され (UI スレッドで作成する必要があります)、実行されると、doInBackground メソッドがバックグラウンド スレッドで呼び出されます。完了すると、onPostExecute メソッドがメイン UI スレッドで呼び出されます。

アプリでこれを使用するには、AsyncTask をサブクラス化する MyTask という名前のプライベート クラス (カスタム アダプター クラスなど) を Activity 内に実装する必要があります。以前の load メソッドの内容で doInBackground メソッドをオーバーライドできます。

ArrayList が返される代わりに、Activity でインスタンス変数を維持して、プライベート クラス間でデータを共有できるようにします。次に、onPostExecute で、以前に onCreate で行ったように、List Adapter にデータを設定できます。onCreate メソッドは、MyTask オブジェクトを作成し、execute メソッドを呼び出すだけになりました。

listViewに最適なサイトthis & thisです。

--

よろしく

TechEnd

于 2012-10-05T05:41:50.997 に答える
4

JSON オブジェクトの重要な要素を、自分で作成した新しいオブジェクトに格納する必要があります。

JSON オブジェクトが名前、日付、電話番号を含むキーを提供するとします。そのような情報を含むオブジェクトが必要です。

リストビューは新しいタイプの arrayadapter を受け取り、リストビューの各セルには、オブジェクトの情報が取り込まれた UI 要素 (テキストビューなど) が含まれます。

これは少なくとも 3 ステップのプロセスであり、これらの各ステップのソリューションに個別に取り組む必要があります。

于 2012-09-28T14:57:27.327 に答える
3

アクティビティでこのコードを試してください最初にjsonデータを解析して文字列配列に変換し、リストビューをアクティビティのxmlに設定します

try
   {

   JSONArray jArray = new JSONArray(result);
   JSONObject jObj=new JSONObject ();
   String[] data=new String[jArray.length()]

       for(int i=0;i<jArray.length();i++)
       {
          jObj= jArray.getJSONObject(i);
          data[i]=json_data.getString("value");

       }

       GameAdapter adapter = new GameAdapter(this, R.layout.listview_item_row, data);
       listView1 = (ListView)findViewById(R.id.listView1);
       listView1.setAdapter(adapter);
}
catch(Exception e)
{
}
于 2012-10-04T12:29:01.227 に答える
1

このトピックに関する優れたリソースを見つけました。これで、Jsonデータのリストができました。すべての初心者に強くお勧めします。助けてくれてありがとう。

于 2012-10-01T18:47:14.880 に答える
0

次の手順に従うことをお勧めします。

  1. Web からデータを取得して保存する
  2. 保存されたデータをアダプターに渡す
  3. アダプターをリストに設定します

最初のステップでは、クラスを使用してデータを取得することをお勧めしますAsyncTask。これにより、バックグラウンド操作を実行し、スレッドやハンドラーを操作することなく UI スレッドで結果を発行できます。次に、取得する JSON 構造に従ってコンテンツを解析する必要があります。最後に、データをアダプタに渡してリストに入力します。

于 2012-10-01T12:51:37.680 に答える