2017-09-01 74 views
0

我已经看到这个问题的相关问题,但我无法弄清楚为什么这不适合我。Android部件列表查看处理点击

我期待在Widget Provider类中的onReceive()方法被调用,因为列表项被点击,但没有任何反应。

一些评论被包括在内,它们也显示了我一直在尝试的内容。

相关代码:

主要的应用程序布局的ListView定义是这样的:

<ListView 
     android:id="@+id/events_list" 
     style="@android:style/TextAppearance.Small" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

行被定义与RelativeLayout的两个嵌套的线性布局,不知道这是分享重要。

getViewAt()通过查看工厂实现,并且这里的功能:

@Override 
    public RemoteViews getViewAt(int position) { 

     if (events_ack == null) { 
      Log.e("LIST", "getViewAt (null) events_ack"); 
      return null; 
     } 

     RemoteViews row = new RemoteViews(context.getPackageName(), R.layout.row); 

     row.setTextViewText(R.id.event_name, events_ack[position].name); 
     row.setTextViewText(R.id.description, events_ack[position].description); 
     row.setTextViewText(R.id.publicTV, (events_ack[position].is_public == 0) ? "Public: False" : "Public: True"); 
     row.setTextViewText(R.id.timeTV, events_ack[position].time); 
     row.setViewVisibility(R.id.price, View.GONE); 

     // download and set image BONUS QUESTION- does not work through AsyncTask using future insted (images are downloaded but not shown). 

     row.setImageViewBitmap(R.id.image, pic); 

     Bundle extras = new Bundle(); 
     extras.putInt(CasusWidgetProvider.EXTRA_WORD, events_ack[position].id); 
     Intent fillInIntent = new Intent(); 
     fillInIntent.putExtras(extras); 
     // Make it possible to distinguish the individual on-click 
     // action of a given item 
     row.setOnClickFillInIntent(R.id.events_list, fillInIntent); 

     //extras.putInt(CasusWidgetProvider.EXTRA_WORD, events_ack[position].id); 
     //i.putExtras(extras); 
     //i.setAction(CasusWidgetProvider.ITEM_CLICK); 
     //row.setOnClickFillInIntent(R.layout.casus_widget, i); //event_name? 

     // ?? 

     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
     RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.casus_widget); 
     appWidgetManager.updateAppWidget(appWidgetId, rv); 
     //appWidgetManager.updateAppWidget(appWidgetId, row); 

     return row; 
    } 

控件提供者类具有的onUpdate()方法:

@Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 

     Log.w("CASUS", "UPDATE function called"); 


     for (int i = 0; i < appWidgetIds.length; i++) { 

      Intent intent = new Intent(context, WidgetService.class); 
      intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); 
      intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
      RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.casus_widget); 
      rv.setRemoteAdapter(appWidgetIds[i], R.id.events_list, intent); 

      Intent clickIntent=new Intent(context, WidgetService.class); 
      clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); 
      clickIntent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
      clickIntent.setAction(ITEM_CLICK); 

      PendingIntent clickPI = PendingIntent.getActivity(context, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
      rv.setPendingIntentTemplate(R.id.events_list, clickPI); 
      appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.events_list); //? 

      clickIntent = new Intent(context, CasusWidgetProvider.class); 
      clickIntent.setAction(UPDATE_LIST); 
      clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 


      PendingIntent pendingIntentRefresh = PendingIntent.getBroadcast(context, 0, clickIntent, 0); 
      rv.setOnClickPendingIntent(R.id.update, pendingIntentRefresh); 

      appWidgetManager.updateAppWidget(appWidgetIds[i], rv); 
     } 

     fetchData(context, appWidgetIds); 

     super.onUpdate(context, appWidgetManager, appWidgetIds); 

    } 

回答

0

我已经想通了。的onUpdate()在微件提供一流的功能进行了修改,如下所示:

@Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     for (int i = 0; i < appWidgetIds.length; i++) { 
      Intent intent = new Intent(context, WidgetService.class); 
      intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]); 
      intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
      RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.casus_widget); 
      rv.setRemoteAdapter(appWidgetIds[i], R.id.events_list, intent); 

      appWidgetManager.updateAppWidget(appWidgetIds[i], rv); 
     } 

     fetchData(context, appWidgetIds); 

     super.onUpdate(context, appWidgetManager, appWidgetIds); 

    } 

在getViewAt()上的小部件厂这条线功能:

row.setOnClickFillInIntent(R.id.events_list, fillInIntent); 

进行了修改以符合正确的ID:

row.setOnClickFillInIntent(R.id.row_layout, fillInIntent); 

点击处理程序模板设置在做HTTP请求的类中,基本上是:

for (int widgetId : allWidgetIds) { 
      RemoteViews remoteViews = new RemoteViews(this.getApplicationContext().getPackageName(), R.layout.casus_widget); 


      Intent svcIntent = new Intent(this.getApplicationContext(), WidgetService.class); 
      svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 
      svcIntent.putExtra("events", events); 
      svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME))); 
      remoteViews.setRemoteAdapter(widgetId, R.id.events_list, svcIntent); 


      Intent clickIntent = new Intent(this.getApplicationContext(), CasusWidgetProvider.class); 
      clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, allWidgetIds); 
      clickIntent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
      clickIntent.setAction(CasusWidgetProvider.ITEM_CLICK); 


      PendingIntent toastPendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
      remoteViews.setPendingIntentTemplate(R.id.events_list, toastPendingIntent); 

      appWidgetManager.updateAppWidget(widgetId, remoteViews); 

     } 

希望这可以帮到..