如果给出了触发器,我想在android app小部件的ListView
中更新某些项目的布局。因此,我在getView()
中的RemoteViewsService.RemoteViewsFactory
方法中实现了以下内容。
public RemoteViews getViewAt(int position) {
...
int remoteViewId;
if (some condition) {
remoteViewId = R.layout.highlighted_item;
} else {
remoteViewId = R.layout.item;
}
RemoteViews rv = new RemoteViews(mContext.getPackageName(), remoteViewId);
此代码在第一次加载窗口小部件时有效,但在使用notifyAppWidgetViewDataChanged
更新时,布局仍然存在且未更改。如何更新用于ListView项的xml布局?
答案 0 :(得分:3)
如果我的假设是正确的,并且您试图通过更改背景颜色或类似的东西来突出显示列表项,我建议使用选择器drawable而不是以编程方式更改布局:
<强>抽拉/ list_item_selector.xml 强>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_activated="true"
android:drawable="@drawable/list_item_background_activated" />
<item
android:state_pressed="true"
android:drawable="@drawable/list_item_background_pressed" />
<item
android:drawable="@drawable/list_item_background" />
</selector>
<强>抽拉/ list_item_background.xml
绘制/ list_item_background_pressed.xml
可拉伸/ list_item_background_activated.xml 强>
为选择器中的每个状态定义这样一个drawable,并用适当的颜色资源替换'color'。
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="color" />
<stroke
android:width="1dp"
android:color="color" />
</shape>
将列表选择器应用于窗口小部件布局中的ListView:
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:listSelector="@drawable/list_item_selector" />
我将它用于我自己的小部件,它完美无缺。 有关州名单的更多信息,请参阅此link。
要更改整个布局,请尝试以下操作:
public class WidgetListProvider implements RemoteViewsFactory {
private boolean alternateLayout = 1;
@Override
public void onDataSetChanged() {
alternateLayout = alternateLayout == 1 ? 2 : 1;
}
@Override
public RemoteViews getViewAt(int position) {
final RemoteViews rv = new RemoteViews(_context.getPackageName(),
alternateLayout == 1 ? R.layout.list_row : R.layout.list_row2);
[...]
return rv;
}
@Override
public int getViewTypeCount() {
return 2;
}
[...]
}
重要:注意getViewTypeCount() - 因为您使用两种不同的布局,所以您必须在此处返回2。如果返回1,将显示第二个布局的加载视图。