Android Widget集合:Listview(RemoteViews)顺序错误

时间:2018-04-18 19:56:57

标签: android listview android-widget remoteview

我正在使用Widget来显示包含日期的事件列表。当列表填充 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;
}
}

非常感谢!!

1 个答案:

答案 0 :(得分:0)

最后我找到了答案:是,它是以不同的顺序调用(有时候,调高高度,几次相同的位置),但 android将它们留在右边为了

所以,我的错误是使用类变量(sCurrentYear)来知道我们是否在新的一年:

sCurrentYear == null || !sCurrentYear.equals(String.valueOf(oEvent.getDateEventYear()))

要解决问题,并将每个事件与他的年份分组,您必须获取列表中的before对象并与当前对象进行比较:

position <= 0 || oEvent.getDateEventYear() != lEvents.get(position-1).getDateEventYear()

就是这样。

P.S。:此外,您可以查看此Google视频以了解有关ListView的更多信息。 https://www.youtube.com/watch?v=wDBM6wVEO70&t=40m45s