2016-09-21 3 views
1

Я искал это уже несколько недель, но я не могу найти ответ. Я пытаюсь создать ListView внутри widget. Мне удалось заполнить ListView. Моя проблема в том, что когда я нажимаю элемент внутри ListView, я хотел открыть Activity и передать Id этого элемента на адрес Activity, который я назвал. Но, похоже, я не могу получить пройденный Id правильно всегда null при переходе на Activity Я позвонил.Работа с элементами в Виджетах 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"); 
.... 
} 

Я заселение моего ListView использования Web Service, который находится внутри моей ListProvider и называя его по onDataSetChanged. При отладке, в то время как заполняется , он также помещает все данные в EXTRA_ID, возможно, именно поэтому, когда открывается Activity, возникает путаница и вместо этого возвращает значение null, я не знаю, почему это можно исправить. Пожалуйста, помогите мне, как это решить. Заранее спасибо за помощь.

+0

Вы не добавили код из своего 'ActivityOne', где вы получаете' null' вместо 'Id'. – Abbas

+0

@Abbas Я добавил свой 'ActivityOne' – natsumiyu

+0

Попробуйте добавить' EXTRA_ID' в 'Intent' из' updateWidgetListView() '. – Abbas

ответ

0

Я нашел большой example я пытался после него и изменений, как установить данные, а затем на onReceive в моем AppWidgetProvider я называю там мой ActivityOne и передал данные от того, что я получаю в Bundle. Это link также поможет мне начать Activity внутри onReceive внутри AppWidgetProvider. Я просто сталкиваюсь с сбоями приложений при удалении виджета на главном экране. Обновит этот ответ, когда узнаю, как его решить.

Редактировать

Я должен решить сокрушительную часть я забыл добавить onDelete, а затем добавить notifyAppWidgetViewDataChanged, а также для ListView его работы хорошо сейчас.