Android 小部件集合:Listview (RemoteViews) 的顺序错误
Android Widget Collection: error in the order of the Listview (RemoteViews)
我正在开发一个小部件来显示带有日期的事件列表。当列表中填满 getViewAt
时会出现问题,调用顺序不同,而且调用次数也不同。
在列表lEvents
中,顺序是正确的。
这是我的 WidgetRemoteViewsFactory:
public class WidgetRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private Context mContext;
private List<EventItem> lEvents;
private DBHandler db;
private String sCurrentYear = null;
public WidgetRemoteViewsFactory(Context applicationContext, Intent intent) {
mContext = applicationContext;
}
@Override
public void onCreate() {
// Recuperar la Base de Datos
if (db == null) { db = new DBHandler(mContext); }
lEvents = db.getAllEventsToday();
}
@Override
public void onDataSetChanged() {
// No se que coño hace
final long identityToken = Binder.clearCallingIdentity();
Binder.restoreCallingIdentity(identityToken);
}
@Override
public void onDestroy() {
}
@Override
public int getCount() {
return lEvents == null ? 0 : lEvents.size();
}
@Override
public RemoteViews getViewAt(int position) {
if (position == AdapterView.INVALID_POSITION ||
lEvents == null) {
return null;
}
EventItem oEvent = lEvents.get(position);
RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_list_item);
if(sCurrentYear == null || !sCurrentYear.equals(String.valueOf(oEvent.getDateEventYear()))) {
sCurrentYear = String.valueOf(oEvent.getDateEventYear());
rv.setTextViewText(R.id.widgetEventYear, oEvent.getDateEventWithFormat(mContext.getString(R.string.widget_date_list_format)));
rv.setViewVisibility(R.id.widgetEventYear, View.VISIBLE);
}
rv.setTextViewText(R.id.widgetEventContent, oEvent.getContent());
return rv;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
return position;
//EventItem oEvent = lEvents.get(position);
//return (oEvent != null) ? oEvent.getId() : position;
}
@Override
public boolean hasStableIds() {
return true;
}
}
非常感谢!!
最后我找到了答案:是的,调用顺序不同(有时,为了测量高度,相同位置的几次),但是android 以正确的顺序离开它们。
所以,我的错误是使用 class 变量 (sCurrentYear
) 来了解我们是否在新的一年:
sCurrentYear == null || !sCurrentYear.equals(String.valueOf(oEvent.getDateEventYear()))
要解决这个问题,并将每个事件与他的年份分组,您必须在列表中获取之前的对象并与当前对象进行比较:
position <= 0 || oEvent.getDateEventYear() != lEvents.get(position-1).getDateEventYear()
仅此而已。
P.S.: 另外,您可以观看此 google 视频以了解有关 ListView 的更多信息。
https://www.youtube.com/watch?v=wDBM6wVEO70&t=40m45s
我正在开发一个小部件来显示带有日期的事件列表。当列表中填满 getViewAt
时会出现问题,调用顺序不同,而且调用次数也不同。
在列表lEvents
中,顺序是正确的。
这是我的 WidgetRemoteViewsFactory:
public class WidgetRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private Context mContext;
private List<EventItem> lEvents;
private DBHandler db;
private String sCurrentYear = null;
public WidgetRemoteViewsFactory(Context applicationContext, Intent intent) {
mContext = applicationContext;
}
@Override
public void onCreate() {
// Recuperar la Base de Datos
if (db == null) { db = new DBHandler(mContext); }
lEvents = db.getAllEventsToday();
}
@Override
public void onDataSetChanged() {
// No se que coño hace
final long identityToken = Binder.clearCallingIdentity();
Binder.restoreCallingIdentity(identityToken);
}
@Override
public void onDestroy() {
}
@Override
public int getCount() {
return lEvents == null ? 0 : lEvents.size();
}
@Override
public RemoteViews getViewAt(int position) {
if (position == AdapterView.INVALID_POSITION ||
lEvents == null) {
return null;
}
EventItem oEvent = lEvents.get(position);
RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_list_item);
if(sCurrentYear == null || !sCurrentYear.equals(String.valueOf(oEvent.getDateEventYear()))) {
sCurrentYear = String.valueOf(oEvent.getDateEventYear());
rv.setTextViewText(R.id.widgetEventYear, oEvent.getDateEventWithFormat(mContext.getString(R.string.widget_date_list_format)));
rv.setViewVisibility(R.id.widgetEventYear, View.VISIBLE);
}
rv.setTextViewText(R.id.widgetEventContent, oEvent.getContent());
return rv;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
return position;
//EventItem oEvent = lEvents.get(position);
//return (oEvent != null) ? oEvent.getId() : position;
}
@Override
public boolean hasStableIds() {
return true;
}
}
非常感谢!!
最后我找到了答案:是的,调用顺序不同(有时,为了测量高度,相同位置的几次),但是android 以正确的顺序离开它们。
所以,我的错误是使用 class 变量 (sCurrentYear
) 来了解我们是否在新的一年:
sCurrentYear == null || !sCurrentYear.equals(String.valueOf(oEvent.getDateEventYear()))
要解决这个问题,并将每个事件与他的年份分组,您必须在列表中获取之前的对象并与当前对象进行比较:
position <= 0 || oEvent.getDateEventYear() != lEvents.get(position-1).getDateEventYear()
仅此而已。
P.S.: 另外,您可以观看此 google 视频以了解有关 ListView 的更多信息。 https://www.youtube.com/watch?v=wDBM6wVEO70&t=40m45s