2017-08-03 5 views
0

Ich habe eine ListView auf Homescreen Widget erstellt, aber ich klickte das Element ListView Ich kann nicht die richtigen Positionsdaten von ListView bekommen. Wie kann ich es tun?Wie kann ich Artikel Daten, wenn Widget ListView

WidgetProvider.class

public class WidgetProvider extends AppWidgetProvider { 

    public static final String TOAST_ACTION = "com.mobistech.mobistechsmart.Widget.TOAST_ACTION"; 
    public static final String MERCHANT_ITEM = "com.mobistech.mobistechsmart.Widget.MERCHANT_ITEM"; 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
         int[] appWidgetIds) { 
     final int N = appWidgetIds.length; 

     for (int i = 0; i < N; ++i) { 
      RemoteViews remoteViews = updateWidgetListView(context, 
        appWidgetIds[i]); 
      appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews); 
     } 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 
    } 



     private RemoteViews updateWidgetListView(Context context, int appWidgetId) { 

     //which layout to show on widget 
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
       R.layout.widget_layout); 

     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); 
     remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view); 


     //When item is clicked on ListView 



     Intent startActivityIntent = new Intent(context, BroadCast.class); 
     PendingIntent startActivityPendingIntent = PendingIntent.getBroadcast(context, 0, startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setPendingIntentTemplate(R.id.listViewWidget, startActivityPendingIntent); 

     return remoteViews; 
    } 

} 

WidgetService.class

public class WidgetService extends RemoteViewsService { 
    /* 
    * So pretty simple just defining the Adapter of the listview 
    * here Adapter is ListProvider 
    * */ 

    @Override 
    public RemoteViewsFactory onGetViewFactory(Intent intent) { 
     int appWidgetId = intent.getIntExtra(
       AppWidgetManager.EXTRA_APPWIDGET_ID, 
       AppWidgetManager.INVALID_APPWIDGET_ID); 

     return (new ListProvider(this.getApplicationContext(), intent)); 
    } 
} 

ListProvider.class

public class ListProvider implements RemoteViewsFactory { 
    private List<Device> listItemList = new ArrayList<Device>(); 
    private Context context = null; 
    private int appWidgetId; 

    public ListProvider(Context context, Intent intent) { 
     this.context = context; 
     appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
       AppWidgetManager.INVALID_APPWIDGET_ID); 

     populateListItem(); 
    } 

    private void populateListItem() { 
     DatabaseHandler db=new DatabaseHandler(context); 
     listItemList=db.getAllDevices(); 
    } 

    @Override 
    public int getCount() { 
     return listItemList.size(); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    /* 
    *Similar to getView of Adapter where instead of View 
    *we return RemoteViews 
    * 
    */ 
    @Override 
    public RemoteViews getViewAt(int position) { 

     final RemoteViews remoteView = new RemoteViews(
       context.getPackageName(), R.layout.list_row); 
     Device device = listItemList.get(position); 
     remoteView.setTextViewText(R.id.row_txt,device.getName()); 
     remoteView.setImageViewResource(R.id.row_image, context.getResources().getIdentifier(device.getIconName(), "drawable", context.getPackageName())); 


     Intent fillInIntent = new Intent(); 
     fillInIntent.putExtra(WidgetProvider.TOAST_ACTION, position); 
     remoteView.setOnClickFillInIntent(R.id.row_txt, fillInIntent); 


     return remoteView; 
    } 


    @Override 
    public RemoteViews getLoadingView() { 
     return null; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 1; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    @Override 
    public void onCreate() { 
    } 

    @Override 
    public void onDataSetChanged() { 
    } 

    @Override 
    public void onDestroy() { 
    } 
} 
+0

Dies könnte helfen, ist es eine mögliche Duplikat dieser Frage ist - [Stack-Überlauf Frage] (https://stackoverflow.com/questions/21195035/android -start-activity-from-app-widget-mit-listview-and-service) – hsm59

+0

Es hat mir nicht geholfen :( –

Antwort

0

Das Positionsfeld aus dieser Funktion ist alles, was erforderlich ist,

Verwandte Themen