2012-09-28 9 views
7

私はAndroidには全く新しく、現在私のサーバーから引き出されたJSON配列からリストビューを生成しようとしています。私は運がないチュートリアルをたくさん読んでいます。あなたは、いくつかのリソースを開始することをお勧めします。アンドロイドでJSONからリストビューを生成

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

私を与える「」ノー識別されるリソースとして:私は次のコードで立ち往生していますが、私はthisページを読んだ

public class AlertsAdapter extends ArrayAdapter<alerts> 

は、任意のヘルプは大歓迎です、ありがとうございます!

+0

あなたはJSONの1の例を投稿することができますが、表示したいオブジェクト?また、リストに名前を表示したいだけですか? –

答えて

16

JSON & listviewあなたの活動のXMLであなたのリストビューのshoulをアダプターセット、あなたの活動にこのコードを試すには、このように動作でしょう。..

1 1.項目のリストを表示する。

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

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

アンアンドロイドSDKはListViewsに任意のデータの配列を処理する方法を知っているアダプタ(ArrayAdaptor)を提供する(Android SDKはまた、リストビューにローカルデータ記憶装置を接続する際に支援することができ、カーソルアダプタなど他のいくつかのListAdaptors、付属しています)。また、各行に要素を描画するために使用できるレイアウトをアダプタに提供する必要があります。例では、私たちは、単一の文字列をレイアウトするための単一のテキストにラベル完璧ですAndroidのSDK提供レイアウト、simple_list_item_1、使用しているの下:各リスト項目の外観を2.customizing

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

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

まず、著者とコンテンツの両方を文字列として保持するために使用できるクラスABCを作成します。その後、カスタムリストの項目に表示されるいくつかのテストデータを持つオブジェクトを作成し、移入:

public class ABC { 
    String userId; 
    String pwd; 
} 

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

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

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

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

カスタムabcListAdaptorの完全な実装は以下の通りです:今のonCreateメソッドが作成したテストデータでカスタムリストアダプタを使用するように調整することができます

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; 
    } 
} 

下図のように:

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には、パッケージaime HTTPベースのAPIへのアクセスを簡素化します。 Apache HTTPクラスが含まれており、org.apache.http packageの下にあります。これらのクラスと、org.jsonクラスを使用して、サーバーから戻ってくるデータを解析します。

私たちは、リクエストを行い、結果を解析し、ArrayListのオブジェクトを返すプライベートメソッドをアクティビティで作成することができます。下記のコードはリクエストを作成し、結果として得られるJSON arrayを検索し、各textと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メソッドの呼び出しで以前に使用したダミーデータを置き換えます。現在の状態で応答性の高いユーザーインターフェース

コードを4.creating

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

アプリを終了することを促す、表示される(ANR)ダイアログを応答しないアプリケーションを引き起こす可能性があります。これは、onCreateなどのメソッド内で実行されるデータのリモート要求を行う長期間の作業のために発生します。

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

JavaのThreadクラスはこのタスクに使用できますが、長期実行タスクが完了すると、結果を報告するようにユーザーインターフェイスを変更する必要があるという複雑さがあります(つまり、要求からロードされる)。

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

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

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

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

ArrayListが返される代わりに、プライベートクラス間でデータを共有できるように、アクティビティにインスタンス変数を保持します。その後、onPostExecuteでは、前にonCreateで行ったように、データとともにList Adapterを設定できます。 onCreateメソッドは単にMyTaskオブジェクトを作成し、executeメソッドを呼び出します。 リストビューため

ベストサイトthis & thisです。

-

よろしく

TechEnd

4

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

JSONオブジェクトに名前、日付、電話番号のキーがあるとすると、そのような情報を含むオブジェクトが必要です。あなたのリストビューは、新しいタイプのarrayadapterを取る

、リストビューの各セルは、オブジェクト

の情報が取り込まれる(例えばtextviewsなど)UI要素を含むであろうことは、少なくとも3段階のプロセスであります、と私はあなたがこれらの手順に従うことをお勧めします

0

個別にこれらの各ステップのための解決策に取り組む必要があります。

  1. ウェブからデータを取得し、それ
  2. はSTORを渡し保存最初のステップであなたのリスト

にアダプタを設定して、アダプタ

  • にデータをエド、私はあなたがバックグラウンド処理を実行しなくても、UIスレッド上の結果を公開することができますAsyncTaskクラスを使用してデータを取得示唆しますスレッドやハンドラを操作する。次に、取得しているJSON構造に従ってコンテンツを解析する必要があります。最後に、データをアダプターに渡して、リストに値を設定します。

  • 1

    私はこのトピックではresourceが良いと判断しました。今私はJsonのデータで私のリストを持っています。すべての初心者をお勧めします。皆さん、助けてくれてありがとう。

    +1

    私は上記のアシュワニの答えがうまくいかない理由を見ることができません。そのように簡単です。 – Nitin

    +3

    あなたは非常に修飾された答えを得ていますので、正しい答えとしてあなた自身の答えを選ぶことはできません。 – dorjeduck

    3

    最初の文字列配列 にJSONデータを解析し、

    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) 
    { 
    } 
    
    +0

    このコードはあなたに役立ちません。あなたの問題が解決されていない場合は、 –

    関連する問題