处理 Widget ListView 中的项目点击 [Android]

问题描述 投票:0回答:2

我已经搜索这个问题好几个星期了,但找不到答案。我正在尝试在

ListView
内创建
widget
。我成功地填充了
ListView
。我的问题是,当我单击
ListView
内的某个项目时,我想打开一个
Activity
并将该项目的
Id
传递给我调用的
Activity
。但似乎我无法正确获取通过的
Id
,当我去我打电话的
null
时,它总是
Activity

这是我的代码

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

小部件服务

public class WidgetService extends RemoteViewsService {

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

列表提供者

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

活动一

public class ActivityOne extends Activity {
  String mID;

 @Override
protected void onCreate(Bundle savedState) {

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

我正在使用

ListView
内部的
Web Service
填充我的
ListProvider
,并在
onDataSetChanged
上调用它。调试时,在填充
List
时,它还会将所有数据放入
EXTRA_ID
中,也许这就是为什么当
Activity
打开时会变得混乱并返回 null 的原因,我不确定为什么如何解决这个问题。请指导我如何解决这个问题。预先感谢您的帮助。

android listview widget
2个回答
1
投票

我发现了一个很棒的示例我尝试遵循它并更改数据的设置方式,然后在我的

onReceive
中的
AppWidgetProvider
上我称之为我的
ActivityOne
并传递了我在
Bundle中获得的数据
。这个链接还帮助我在
Activity
内的
onReceive
内启动
AppWidgetProvider
。我只是在删除主屏幕上的小部件时遇到应用程序崩溃。当我发现如何解决这个问题时,会更新这个答案。

编辑

我必须解决崩溃部分,我忘记添加

onDelete
,然后添加
notifyAppWidgetViewDataChanged
以及
ListView
,它现在工作正常。


0
投票

我的代码和example一样,但是我发现App在线,listview项可以通过点击onReceive()来接收广播。并且可以跳转到正确的Activity。 但是,当App被杀死,listview项点击onReceive()时,无法接收到广播,App也无法被挂起。 有人遇到过这个问题吗

© www.soinside.com 2019 - 2024. All rights reserved.