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