改变背景
如果我的假设是正确的,并且您正试图通过更改背景颜色或类似的东西来突出显示列表项,我建议使用可绘制的选择器,而不是以编程方式更改布局:
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
drawable/list_item_background_activated.xml
为选择器中的每个状态定义这样一个可绘制对象,并将“颜色”替换为适当的颜色资源。
<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,则会为第二个布局显示加载视图。