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

Android ListActivity中上下文相关弹出菜单的设计模式,android,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

我有一个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>
现在,当用户单击菜单项时,将执行一个操作,但需要行的值来正确设置请求的格式

我正在寻找最好的设计模式来做到这一点

可能是ListActivity的ListView的行视图的子类化,但是如何实现呢? 可能是对PopupMenu进行子类化,以便它保留用于创建行的数据版本? 等等

有人有好主意吗

干杯。
大卫

是否已将listview与适配器一起使用?这将使它非常容易处理,有许多关于如何处理的示例(例如)

您是否使用了带适配器的listview?这将使它非常容易处理,有许多关于如何处理的示例(例如)

一种可能的基于YAGNI的方法

  • 弹出还是不弹出?我相信你对此没有问题。所有数据都在getView()中。因此,一个简单的if()似乎就足够了

  • 假设您的弹出菜单总是相同的,只是根据数据的不同,操作会有所不同,那么您只需要了解菜单数据。要实现这一点,您需要在onMenuItemClick()中引用相应的数据项。要实现这一目标,您可以:

    • 子类化弹出菜单

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

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

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

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


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

    一种可能的基于YAGNI的方法

  • 弹出还是不弹出?我相信你对此没有问题。所有数据都在getView()中。因此,一个简单的if()似乎就足够了

  • 假设您的弹出菜单总是相同的,只是根据数据的不同,操作会有所不同,那么您只需要了解菜单数据。要实现这一点,您需要在onMenuItemClick()中引用相应的数据项。要实现这一目标,您可以:

    • 子类化弹出菜单

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

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

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

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


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

    这就是我的想法。。。不是最好的模式,但会达到它的效果。顺便问一下,您知道如何从弹出菜单访问活动吗?我希望已从活动启动对服务器的请求。如果其他类是活动中的内部类,请使用MyActivity.this。否则,可以传递活动,例如,作为另一个构造函数/方法参数。小心活动泄漏。如果你将对活动的引用保存在一些比它更久的对象中,它们就会发生。这就是我的想法。。。不是最好的模式,但会达到它的效果。顺便问一下,您知道如何从弹出菜单访问活动吗?我希望已从活动启动对服务器的请求。如果其他类是活动中的内部类,请使用MyActivity.this。否则,可以传递活动,例如,作为另一个构造函数/方法参数。小心活动泄漏。如果将对活动的引用保留在某些比活动更久的对象中,则可能会发生这种情况。
    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();               
    }               
    });