JSON
&listview
このように動作します..
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 コードと同じように参照できるようになりました。
ListAdaptor
which 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