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 以使其保留用于创建行的数据版本?ETC...

有人有好主意吗?

干杯。大卫。

4

2 回答 2

0

您是否将列表视图与适配器一起使用?这将使其非常容易处理,有很多关于如何做到这一点的示例(例如http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/

于 2012-10-11T09:11:22.790 回答
0

一种可能的基于 YAGNI 的方法。

  1. 弹出还是不弹出?我相信你对此没有任何问题。您在 getView() 中拥有所有方便的数据。所以一个简单的 if() 似乎就足够了。

  2. 假设您的弹出菜单始终相同,只是操作因数据而异,您只需使菜单具有数据感知能力。为此,您需要在 onMenuItemClick() 中引用相应的数据项。要到达那里,您可以:

    • 子类化弹出菜单

    • 将位置传递给菜单的自定义构造函数

    • 使用 onMenuItemClick() 中的位置通过 adapter.getItem(int position) 检索数据项并在那里应用任何所需的逻辑

这种方法的好处是极简主义。你只传递一个整数。

PS。此外,如果你愿意,你可以很好地封装东西。

聚苯乙烯。如果您需要各种弹出菜单,您可以创建一个工厂,该工厂知道如何在从 getView() 调用时创建正确的子类。

于 2012-10-11T09:58:27.310 回答