gpt4 book ai didi

java - Android widget listview 处理点击

转载 作者:行者123 更新时间:2023-12-02 12:18:04 28 4
gpt4 key购买 nike

我已经看到了与此问题相关的问题,但我无法弄清楚为什么这对我不起作用。

我期望在单击列表项时调用 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" />

Row 是使用relativelayout 定义的,具有两个嵌套的线性布局,不确定这是否值得分享。

getViewAt()是通过 View 工厂实现的,其功能如下:

@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;
}

Widget Provider 类有 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);

}

最佳答案

我已经弄清楚了。小部件提供程序类中的 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);

}

希望这会有所帮助..

关于java - Android widget listview 处理点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46003445/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com