Android 从小部件传递到活动的项目错误

Android 从小部件传递到活动的项目错误,android,android-widget,Android,Android Widget,我有一个正在使用集合的小部件。我需要的是,当小部件ListView的一行被选中时,将一个id从小部件传递到我应用程序中的一个活动 由于某些原因,在调试活动时,发送了错误的id。我已经把范围缩小到和这个职位有关的事情上了。如果我在调试时将该位置传递给我的活动,那么它是错误的位置,这可能只是我对具有集合的小部件如何工作的误解,因为它是我的第一个位置 小部件服务 public class WidgetService extends RemoteViewsService { @Override

我有一个正在使用集合的小部件。我需要的是,当小部件
ListView
的一行被选中时,将一个id从小部件传递到我应用程序中的一个活动

由于某些原因,在调试活动时,发送了错误的id。我已经把范围缩小到和这个职位有关的事情上了。如果我在调试时将该位置传递给我的活动,那么它是错误的位置,这可能只是我对具有集合的小部件如何工作的误解,因为它是我的第一个位置

小部件服务

public class WidgetService extends RemoteViewsService {
    @Override
    public RemoteViewsFactory onGetViewFactory(Intent intent) {
        return new StackRemoteViewsFactory(this.getApplicationContext(), intent);
    }
}

class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory  {

        private List<Integer> mIds = new ArrayList<Integer>();
        private Context mContext;
        private int mAppWidgetId;

        public StackRemoteViewsFactory(Context context, Intent intent) {
            mContext = context;
            mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
        }

        public void onCreate() {
        }

        public int getCount() {
            // TODO Auto-generated method stub
            return mIds.size();
        }

        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        public RemoteViews getLoadingView() {
            // TODO Auto-generated method stub
            return null;
        }

        public RemoteViews getViewAt(int position) {
            RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.widget_item);
            final Intent mi = new Intent(mContext, MyActivity.class);
            final Bundle bun = new Bundle();
            bun.putInt("id", mIds.get(position));
            mi.putExtras(bun);

            final PendingIntent piMain = PendingIntent.getActivity(mContext, mAppWidgetId, mi, PendingIntent.FLAG_UPDATE_CURRENT);

            rv.setOnClickPendingIntent(R.id.widget_text, piMain);
            rv.setTextViewText(R.id.widget_text, mIds.get(position));

            return rv;
        }

        public int getViewTypeCount() {
            // TODO Auto-generated method stub
            return 1;
        }

        public boolean hasStableIds() {
            // TODO Auto-generated method stub
            return true;
        }

        public void onDataSetChanged() {
            mIds = Utilities.GetIds();
        }

        public void onDestroy() {
            // TODO Auto-generated method stub

        }
}
getActivity()
中,不要将
mAppWidgetId
用作请求代码:对于小部件实例,小部件ID是常量。因此,平台无法将新的
意图
识别为“新的”,并将始终提供相同的
挂起内容
。引述自:

。。。为了检索悬而未决的内容,了解两个意图何时被视为相同是很重要的。人们常犯的一个错误是创建多个PendingEvent对象,其意图仅在“额外”内容上有所不同,期望每次都获得不同的PendingEvent。这种情况不会发生。用于匹配的意图部分与定义的相同。如果根据Intent.filterEquals使用两个等效的Intent对象,则两个对象将获得相同的PendingIntent

有两种典型的处理方法

如果确实需要多个不同的PendingEvent对象同时处于活动状态(例如用作同时显示的两个通知),则需要确保它们有不同之处,以便将它们与不同的PendingEvents关联。这可能是Intent.filterEquals考虑的任何Intent属性,或提供给、或的不同请求代码整数

因此,请使用每行唯一的ID:
position
是一个很好的候选者

getActivity()
中,不要将
mAppWidgetId
用作请求代码:对于小部件实例,小部件ID是常量。因此,平台无法将新的
意图
识别为“新的”,并将始终提供相同的
挂起内容
。引述自:

。。。为了检索悬而未决的内容,了解两个意图何时被视为相同是很重要的。人们常犯的一个错误是创建多个PendingEvent对象,其意图仅在“额外”内容上有所不同,期望每次都获得不同的PendingEvent。这种情况不会发生。用于匹配的意图部分与定义的相同。如果根据Intent.filterEquals使用两个等效的Intent对象,则两个对象将获得相同的PendingIntent

有两种典型的处理方法

如果确实需要多个不同的PendingEvent对象同时处于活动状态(例如用作同时显示的两个通知),则需要确保它们有不同之处,以便将它们与不同的PendingEvents关联。这可能是Intent.filterEquals考虑的任何Intent属性,或提供给、或的不同请求代码整数

因此,请使用每行唯一的ID:
position
是一个很好的候选者

getActivity()
中,不要将
mAppWidgetId
用作请求代码:对于小部件实例,小部件ID是常量。因此,平台无法将新的
意图
识别为“新的”,并将始终提供相同的
挂起内容
。引述自:

。。。为了检索悬而未决的内容,了解两个意图何时被视为相同是很重要的。人们常犯的一个错误是创建多个PendingEvent对象,其意图仅在“额外”内容上有所不同,期望每次都获得不同的PendingEvent。这种情况不会发生。用于匹配的意图部分与定义的相同。如果根据Intent.filterEquals使用两个等效的Intent对象,则两个对象将获得相同的PendingIntent

有两种典型的处理方法

如果确实需要多个不同的PendingEvent对象同时处于活动状态(例如用作同时显示的两个通知),则需要确保它们有不同之处,以便将它们与不同的PendingEvents关联。这可能是Intent.filterEquals考虑的任何Intent属性,或提供给、或的不同请求代码整数

因此,请使用每行唯一的ID:
position
是一个很好的候选者

getActivity()
中,不要将
mAppWidgetId
用作请求代码:对于小部件实例,小部件ID是常量。因此,平台无法将新的
意图
识别为“新的”,并将始终提供相同的
挂起内容
。引述自:

。。。为了检索悬而未决的内容,了解两个意图何时被视为相同是很重要的。人们常犯的一个错误是创建多个PendingEvent对象,其意图仅在“额外”内容上有所不同,期望每次都获得不同的PendingEvent。这种情况不会发生。用于匹配的意图部分与定义的相同。如果根据Intent.filterEquals使用两个等效的Intent对象,则两个对象将获得相同的PendingIntent

有两种典型的处理方法

如果确实需要同时激活多个不同的PendingEvent对象(例如用作同时显示的两个通知)
public class Activity extends SherlockFragmentActivity {

    @Override
    public void onCreate(final Bundle icicle)
    {    
        super.onCreate(icicle);

        setContentView(R.layout.browser_pager);

        if (getIntent().getExtras() != null)
        {
            final Bundle extras = getIntent().getExtras();

            int id = extras.getInt("id"); //this id is wrong
        }
    }
}
final PendingIntent piMain = PendingIntent.getActivity(mContext, mAppWidgetId, mi, PendingIntent.FLAG_UPDATE_CURRENT);