Webサービスから配列を取得します。
私はこれを得た:
WS w=new WS();
w.WebServiceCallExampleGetArray();
これを返します:List<Category>
私はlistViewを持っています ListView list;
w.WebServiceCallExampleGetArray() を listViewにバインドする方法
Webサービスから配列を取得します。
私はこれを得た:
WS w=new WS();
w.WebServiceCallExampleGetArray();
これを返します:List<Category>
私はlistViewを持っています ListView list;
w.WebServiceCallExampleGetArray() を listViewにバインドする方法
ArrayAdapterを拡張し、getView ()をオーバーライドできます。このようないくつかのより深いListViewチュートリアルも役立つようです。
リスト ビューを便利なリストにバインドする一般的なクラスを作成しました。必要に応じてアイデアを拡張できます。まず、私のアドバイスに従って ORM を使用すると仮定します。これは、db クエリが最終的にクラス T の列挙可能な配列に変換されることを意味します。
例として、PointClass からの項目のリストと (mylistView) という名前の ListView があり、次の行スタイルを使用してこのクラスをリスト ビューにバインドするとします (興味深い部分は tag="Bind={}" です)。
listrowitems.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/itemName"
android:layout_width="fill_parent"
android:layout_height="25dip"
android:tag="Bind={Name}" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/itemPoint"
android:layout_width="wrap_content"
android:gravity="right"
android:tag="Bind={Point}" />
<TextView
android:id="@+id/itemScale"
android:layout_width="wrap_content"
android:gravity="right"
android:tag="Bind={UnitScale}" />
</LinearLayout>
</LinearLayout>
ListViewAdapter クラス (コードは以下にあります) を使用すると、これはわずか 2 行のコードです。
listadapter = new ListViewAdapter(ActivityDailyRecord.this,items,R.layout.listrowitems);
mylistView.setAdapter(listadapter);
興味深い部分はtag="Bind={FieldName}"です ... listrowitems レイアウト全体をトラバースし、リフレクションを使用してフィールド値を設定します。xml ファイルのタグのフィールド名に注意する必要があります。
public class ListViewAdapter extends BaseAdapter {
private List<?> items;
private Context context = null;
private int rowLayoutResId;
public interface RowChildClickCallBack {
public void OnClick(int position, View v);
}
private HashMap<Integer, RowChildClickCallBack> eventMappers = null;
/**
*
*/
public ListViewAdapter(Context context, List<?> items, int rowLayourId,
HashMap<Integer, RowChildClickCallBack> eventMappers) {
this.items = items;
this.context = context;
this.rowLayoutResId = rowLayourId;
this.eventMappers = eventMappers;
// items.get(0).getClass().getName()
}
public ListViewAdapter(Context context, List<?> items, int rowLayourId) {
this.items = items;
this.context = context;
this.rowLayoutResId = rowLayourId;
this.eventMappers = null;
// items.get(0).getClass().getName()
}
public void setItems(List<?> items) {
this.items = items;
}
public void rebind(List<?> items) {
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return (Object) items.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
if (convertView == null) {
gridView = new View(context);
gridView = inflater.inflate(rowLayoutResId, null);
} else {
gridView = (View) convertView;
// Log.e("ListViewAdapter",String.valueOf(position));
}
ViewGroup vg = (ViewGroup) gridView;
// Log.e("ListViewAdapter",String.valueOf(position));
traverseControls(vg, position);
return gridView;
}
private boolean hasBindValue(String tagStr) {
// // *Bind={sth}*
Pattern pBindMathcher = Pattern.compile(".*Bind=\\{(\\w+)\\}.*");
Matcher mBind = pBindMathcher.matcher(tagStr);
return mBind.matches();
}
private String getBindValue(String tagStr) {
// // Bind={sth},Style={fontName:{}}
Pattern pBindMathcher = Pattern.compile(".*Bind=\\{(\\w+)\\}.*");
Matcher mBind = pBindMathcher.matcher(tagStr);
String bind = "";
if (mBind.matches()) {
bind = mBind.group(1);
}
return bind;
}
private View traverseControls(ViewGroup v, int position) {
View invalid = null;
for (int i = 0; i < v.getChildCount(); i++) {
View child = v.getChildAt(i);
if (child.getTag() != null) {
if (hasBindValue(child.getTag().toString())) {
String fName = getBindValue(child.getTag().toString());
try {
Field f = items.get(position).getClass()
.getField(fName);
// //////////// Set Text if it has bindings
// ////////////
if (child instanceof EditText) {
EditText e = (EditText) child;
e.setText(String.valueOf(f.get(items.get(position))));
} else if (child instanceof TextView) {
TextView e = (TextView) child;
e.setText(String.valueOf(f.get(items.get(position))));
}
} catch (Exception ex) {
}
}
} else if (child instanceof ViewGroup) {
invalid = traverseControls((ViewGroup) child, position); // Recursive
// call.
if (invalid != null) {
break;
}
}
if (eventMappers != null) {
if (eventMappers.containsKey(child.getId())) {
final View vw = child;
final int resID = child.getId();
final int pos = position;
child.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
eventMappers.get(resID).OnClick(pos, vw);
}
});
}
}
}
return invalid;
}
}
また、パフォーマンスについてはテストしていないため、多数の行で使用する場合は注意してください。