我有一个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以便保留用于创建行的数据版本? 等...
任何有好主意的人?
干杯。 大卫。
答案 0 :(得分:0)
您是否使用了适配器的listview?这将使其易于处理,有很多关于如何执行此操作的示例(例如http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/)
答案 1 :(得分:0)
一种可能的基于YAGNI的方法。
要弹出还是不弹出?我相信你没有问题。您可以在getView()中获得所有数据。所以一个简单的if()似乎就足够了。
假设您的弹出菜单始终相同,只有操作因数据而异,您只需要使菜单具有数据感知功能。要实现这一点,您需要在onMenuItemClick()中引用相应的数据项。为了实现目标,您可以:
弹出菜单
将位置传递给菜单的自定义构造函数
使用onMenuItemClick()中的位置通过adapter.getItem(int position)检索数据项并在那里应用任何所需的逻辑
这种方法的好处是极简主义。你只传递一个整数。
PS。此外,如果您愿意,可以很好地封装内容。
PPS。如果您需要各种弹出菜单,可以创建一个工厂,知道如何在从getView()调用时创建正确的子类。