ListView项目ID主屏幕小部件

时间:2013-09-03 15:20:33

标签: android android-widget

我的主屏widgetListView

如何获取点击的当前Item的数量: 我试过按照以下方式做到这一点: 扩展的现场自定义类 AppWidgetProvider

 public void onUpdate(Context ctxt, AppWidgetManager mgr,
                         int[] appWidgetIds) {
        for (int i=0; i<appWidgetIds.length; i++) {
            Intent svcIntent=new Intent(ctxt, WidgetService.class);

            svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
            svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));

            RemoteViews widget=new RemoteViews(ctxt.getPackageName(),
                    R.layout.widget);

            widget.setRemoteAdapter(appWidgetIds[i], R.id.contacts,
                    svcIntent);

            Intent clickIntent=new Intent(ctxt, AppWidget.class);


            clickIntent.setAction(ACTION_WIDGET_REFRESH);
            clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds[i]);

            PendingIntent pi=PendingIntent.getBroadcast(ctxt, 0 , clickIntent,  PendingIntent.FLAG_UPDATE_CURRENT);
            widget.setPendingIntentTemplate(R.id.contacts, pi);
            mgr.updateAppWidget(appWidgetIds[i], widget);
        }
        super.onUpdate(ctxt, mgr, appWidgetIds);
    } 

@Override
        public void onReceive(Context context, Intent intent) {
        Log.i("gotcha","receive");


        if (intent.getAction().equals(ACTION_WIDGET_REFRESH)) {

            Intent callIntent = new Intent(Intent.ACTION_CALL);
            Bundle extras = intent.getExtras();
            int extrass= -1;
            if(extras!=null) {
                 extrass = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_IDS);
            }

            Log.i("receive", Integer.toString(extrass) ) ; // Here is I've expected to see Item ID

        }

但它没有帮助。我刚看到不同的数字(不是商品ID)

我如何获得它们?

2 个答案:

答案 0 :(得分:3)

问题是

  PendingIntent pi=PendingIntent.getBroadcast(ctxt, 0 , clickIntent,  PendingIntent.FLAG_UPDATE_CURRENT);

因为如果你总是将{0}设为requestCode,并且标志为FLAG_UPDATE_CURRENT,则所有列表项都会引用由持续更新的相同PendingIntent

所以只要给PendingIntent提供不同的requestCode就可以解决这个问题,请使用

PendingIntent pi=PendingIntent.getBroadcast(ctxt,  appWidgetIds[i] , clickIntent,  PendingIntent.FLAG_UPDATE_CURRENT)`

代替。     并将OnClickFillIntent设置为adapter.getViewAt()

中的RemoteView
    RemoteViews rv = new RemoteViews(pkg, R.layout.item);
    Intent i = new Intent().putExtra("position", position);
    rv.setOnClickFillInIntent(R.id.item, i);

然后您可以检索appwidget ID以及列表项位置。

答案 1 :(得分:0)

一旦我认为你得到了我们应该做的事情,请阅读它

在小部件中使用集合(例如ListView,StackView等)时,在单个项目上设置PendingIntents是非常昂贵的,因此是不允许的。相反,此方法应该用于在集合上设置单个PendingIntent模板,并且各个项可以使用setOnClickFillInIntent(int,Intent)区分它们的点击行为。