0

Webサービスから配列を取得します。

私はこれを得た:

WS w=new WS();
 w.WebServiceCallExampleGetArray();

これを返します:List<Category>

私はlistViewを持っています ListView list;

w.WebServiceCallExampleGetArray()listViewにバインドする方法

4

2 に答える 2

0

ArrayAdapterを拡張し、getView ()をオーバーライドできます。このようないくつかのより深いListViewチュートリアルも役立つようです。

于 2012-10-25T12:17:54.310 に答える
0

リスト ビューを便利なリストにバインドする一般的なクラスを作成しました。必要に応じてアイデアを拡張できます。まず、私のアドバイスに従って 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;
}
}

また、パフォーマンスについてはテストしていないため、多数の行で使用する場合は注意してください。

于 2014-04-06T19:32:31.083 に答える