【问题标题】:Android Widget Collection: error in the order of the Listview (RemoteViews)Android Widget Collection:Listview(RemoteViews)的顺序错误
【发布时间】:2018-04-18 19:56:56
【问题描述】:

我正在开发一个小部件来显示带有日期的事件列表。当列表被 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 listview android-widget remoteview


    【解决方案1】:

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

    所以,我的错误是使用类变量 (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

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2015-07-30
      • 2018-01-01
      • 1970-01-01
      相关资源
      最近更新 更多