0

以前にこれを行った他のアプリケーション (Google Play の「カテゴリ」リストなど) と同様に、アプリケーションのリストにメニュー (アクティビティとダイアログを開く) を実装しようとしています。思ったほど単純なことではないことに気がつきました。

私が考えたのは、アクション名用とアイコン用の 2 つのリストを作成することです。次に、 を使用SimpleAdapterしてそれらをリストのアイテムに接続します。イベントではonItemClicked、大規模なスイッチ ケース セグメントを実行し、各アイテムに必要なアクションを実行します。

それが正しい方法だとは思いません。それを行うにはさまざまな(そしてより簡単な)方法がありますか?

4

1 に答える 1

1

どうぞ:

1.メソッドの呼び出しにリフレクションを使用し、メソッドをアイテムのタグとして設定します。次に、項目をクリックして View のタグからメソッドを取得します。

1.1.または、メソッドの文字列名を使用して、自分のコードを呼び出すことができます:

public static Object makeNativeApiFunctionCall(Object target, String functionName, Object... parameters) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        Object responseObject;
        Method method = target.getClass().getMethod(functionName, parameters.getClass());
        responseObject = method.invoke(target, new Object[]{parameters});
        return responseObject;
    }

2.この最善の方法では、BaseAdapter を使用し、独自のタイプのアイテムを使用します (

class MyListMenuItem{
  String methodName;
  String title;
  Integer imgResource;
}

3. また、アイテムの XML レイアウトで非表示の textView を 1 つ使用して SimpleAdapter を使用することもできます。そして、アイテムがクリックされて、メソッドのこの非表示の textView 名から (文字列として) 取得されます。もちろん、この textView メソッドの名前を設定する必要がある前に。

それは好きです:

String[] texts = { "sometext 1", "sometext 2" };
int[] images = { R.id.img1, R.id.img2};
String methods={"Method1","Method2"};

ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(
    texts.length);
Map<String, Object> m;
for (int i = 0; i < texts.length; i++) {
  m = new HashMap<String, Object>();
  m.put(ATTRIBUTE_NAME_TEXT, texts[i]);
  m.put(ATTRIBUTE_NAME_METHOD, methods[i]);
  m.put(ATTRIBUTE_NAME_IMAGE, images[i]);
  data.add(m);
}

String[] from = { ATTRIBUTE_NAME_TEXT, ATTRIBUTE_NAME_METHOD,
    ATTRIBUTE_NAME_IMAGE };
int[] to = { R.id.tvText, R.id.hiddenTextView, R.id.ivImg };

SimpleAdapter sAdapter = new SimpleAdapter(this, data, R.layout.item,
    from, to);

lvSimple = (ListView) findViewById(R.id.lvSimple);
lvSimple.setAdapter(sAdapter);
于 2013-06-10T19:06:55.450 に答える