ListActivity中上下文相关弹出菜单的设计模式

时间:2012-10-11 08:59:49

标签: android

我有一个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以便保留用于创建行的数据版本? 等...

任何有好主意的人?

干杯。 大卫。

2 个答案:

答案 0 :(得分:0)

您是否使用了适配器的listview?这将使其易于处理,有很多关于如何执行此操作的示例(例如http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/

答案 1 :(得分:0)

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

  1. 要弹出还是不弹出?我相信你没有问题。您可以在getView()中获得所有数据。所以一个简单的if()似乎就足够了。

  2. 假设您的弹出菜单始终相同,只有操作因数据而异,您只需要使菜单具有数据感知功能。要实现这一点,您需要在onMenuItemClick()中引用相应的数据项。为了实现目标,您可以:

    • 弹出菜单

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

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

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

    PS。此外,如果您愿意,可以很好地封装内容。

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