2016-09-21 67 views
1

我一直在搜索这个数周,但我找不到答案。我正在尝试在widget内创建一个ListView。我设法填充ListView。我的问题是,当我点击ListView内的一个项目时,我想打开一个Activity并将该项目的Id传递给我所调用的Activity。但似乎我无法正确地通过Id,当我打电话给Activity时,它总是null在Widget ListView中处理物品点击[Android]

这里是我的代码

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"); 
.... 
} 

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

+0

你还没有从你的'ActivityOne'中添加代码,你得到'null'而不是'Id'。 – Abbas

+0

@Abbas我已经添加了我的'ActivityOne' – natsumiyu

+0

尝试并从'updateWidgetListView()'的'Intent'中添加'EXTRA_ID'。 – Abbas

回答

0

我发现了一个伟大example我尝试以下,并改变数据的设置,然后在onReceive在我AppWidgetProvider我叫我的存在和ActivityOne从我在Bundle得到传递的数据。这个link也帮我开始在AppWidgetProvider里面的onReceive里面的Activity。我在主屏幕上移除小部件时遇到应用程序崩溃。当我发现如何解决它时,会更新这个答案。

编辑

我解决了崩溃的部分我忘了加上onDelete,然后添加notifyAppWidgetViewDataChanged以及为ListView其工作正常了。