2016-09-21 35 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其工作正常了。