在小部件ListView中处理项目点击 [Android]

6
我已经搜索了几周,但仍然找不到答案。我正在尝试在小部件内创建一个ListView。我设法填充ListView。我的问题是,当我单击ListView中的项目时,我希望打开一个Activity并将该项的Id传递给我所调用的Activity。但似乎我无法正确获取传递的Id,当进入我所调用的Activity时,它始终为null。
以下是我的代码:
WidgetProvier
public class WidgetProvider extends AppWidgetProvider {
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                     int[] appWidgetIds) {
....
  for (int i = 0; i < N; ++i) {
        RemoteViews remoteViews = updateWidgetListView(context,
                appWidgetIds[i]);


        appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds[i], R.id.listViewWidget);
        appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
    }

    super.onUpdate(context, appWidgetManager, appWidgetIds);
}

  private RemoteViews updateWidgetListView(Context context, int appWidgetId) {
  //For ListView
  Intent svcIntent = new Intent(context, WidgetService.class);
  svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
  svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
 remoteViews.setRemoteAdapter(appWidgetId, R.id.listViewWidget, svcIntent);
    //When item is clicked on ListView
    Intent startActivityIntent = new Intent(context, ActivityOne.class);
    PendingIntent startActivityPendingIntent = PendingIntent.getActivity(context, 0, startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    remoteViews.setPendingIntentTemplate(R.id.listViewWidget, startActivityPendingIntent); 

 return remoteViews;
}

WidgetService

public class WidgetService extends RemoteViewsService {

@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
    return (new ListProvider(this.getApplicationContext(), intent));
}
}

ListProvider 列表提供者
 @Override
 public RemoteViews getViewAt(int position) {
 final RemoteViews widgetRow = new RemoteViews(
        context.getPackageName(), R.layout.list_row);

ListItem listItem = listItemList.get(position);
widgetRow.setTextViewText(R.id.txtID, listItem.id);

//Pass the ID to ActivityOne 
Intent fillInIntent = new Intent();
fillInIntent.putExtra("EXTRA_ID", listItem.id);
widgetRow.setOnClickFillInIntent(R.id.llRow, fillInIntent);

return widgetRow;
}

ActivityOne

public class ActivityOne extends Activity {
  String mID;

 @Override
protected void onCreate(Bundle savedState) {

....
 mID = intent.getStringExtra("EXTRA_ID");
....
}

我正在使用一个位于我的ListProvider内部的Web服务来填充我的ListView,并在onDataSetChanged上调用它。调试时,当List被填充时,它也将所有数据放入EXTRA_ID中,也许这就是打开Activity时混淆并返回null的原因,我不确定如何解决。请指导我如何解决。非常感谢你的帮助。

你没有将ActivityOne中获取Id的代码添加进来,导致出现了null - Abbas
@Abbas 我已经添加了我的 ActivityOne - natsumiyu
尝试在updateWidgetListView()中的Intent中添加EXTRA_ID - Abbas
@Abbas 像这样 startActivityIntent.putExtra("EXTRA_ID2", intent.getStringExtra("EXTRA_ID"); );?我想知道如何从 ListProvider 中获取 Id。 - natsumiyu
为什么不先添加一个硬编码值开始,看看你是否在Activity中得到了它而不是空值。以后再担心细节。 - Abbas
1个回答

1
我发现了一个很棒的示例,我尝试跟着它更改了数据的设置,然后在AppWidgetProvider中的onReceive中调用了我的ActivityOne并传递了从Bundle中获取的数据。这个链接还帮助我在AppWidgetProvideronReceive内启动了一个Activity。当我在主屏幕上移除小部件时,我遇到了应用程序崩溃的问题。找到解决方法后,我会更新这个答案。 编辑

我解决了崩溃问题,我忘记添加onDelete,然后为ListView添加了notifyAppWidgetViewDataChanged,现在它运行得很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接