2

行が次のように定義された ListActivity があります。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
 <TextView android:id="@+id/me_games_won"
     android:textSize="16sp"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"/>

<TextView android:id="@+id/gamesmate_username"
     android:textSize="16sp"
     android:textStyle="bold"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"/>
 <TextView android:id="@+id/him_games_won"
     android:textSize="16sp"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"/>
 <ImageView
    android:id="@+id/imageMenuGamesmate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_settings" />     
</LinearLayout>

画像は、行のステータスに応じてメニューをポップアップするかどうかに使用されます。私の ArrayAdapter には、ポップアップ メニューを起動するための次のコードがあります。

public View getView(int position, View convertView, ViewGroup parent) {
...
myimage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu popupMenu = new PopupMenu(v.getContext(), v);
popupMenu.getMenuInflater().inflate(R.menu.popupmenu_gamesmate, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

@Override
public boolean onMenuItemClick(MenuItem item) {

return true;
}
});

popupMenu.show();               
}               
});

ユーザーがメニュー項目をクリックするとアクションが実行されますが、リクエストを適切にフォーマットするには行の値が必要です。

これを行うのに最適なデザインパターンを探していますか?

ListActivity の ListView の行ビューをサブクラス化するかもしれませんが、それではどうすればよいでしょうか? 行の作成に使用されるデータのバージョンを保持するために、PopupMenu をサブクラス化するのでしょうか。等...

良いアイデアを持っている人はいますか?

乾杯。デビッド。

4

2 に答える 2

0

1つの可能なYAGNIベースのアプローチ。

  1. ポップアップするかどうか?これで問題ないと思います。getView()にすべてのデータがあります。したがって、単純なif()で十分なようです。

  2. ポップアップメニューが常に同じであると仮定すると、アクションのみがデータに応じて変化し、メニューをデータベース対応にするだけで済みます。これを実現するには、onMenuItemClick()で対応するデータ項目への参照が必要です。そこに到達するには、次のことができます。

    • ポップアップメニューをサブクラス化する

    • メニューのカスタムコンストラクターに位置を渡します

    • onMenuItemClick()の位置を使用して、adapter.getItem(int position)を介してデータ項目を取得し、そこに必要なロジックを適用します

このアプローチの利点はミニマリズムです。整数を渡すだけです。

PS。さらに、必要に応じて、ものをうまくカプセル化することができます。

PPS。さまざまなポップアップメニューが必要な場合は、getView()から呼び出されたときに適切なサブクラスを作成する方法を知っているファクトリを作成できます。

于 2012-10-11T09:58:27.310 に答える
0

アダプターでリストビューを使用しましたか? これにより、処理が非常に簡単になります。これを行う方法に関する多くの例があります (例: http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/ )

于 2012-10-11T09:11:22.790 に答える