Виджет работает корректно для первого клика, но некорректен для остальных - PullRequest
0 голосов
/ 05 января 2020

Моя основная цель - получение данных с веб-сервиса и отображение на виджете. Согласно моим исследованиям, я нашел пример виджета на Inte rnet и изменил его для своего проекта. Проблема заключается в том, что при первом нажатии кнопки виджета он получает данные из веб-службы и хорошо их отображает. Но когда я нажал на секунду на кнопке, он не использует класс обслуживания виджетов, о котором я упоминал выше. Это мой WidgetService.class.

 [Service(Permission = "android.permission.BIND_REMOTEVIEWS", Exported = false)]
    public class WidgetService : RemoteViewsService
    {

    public override IRemoteViewsFactory OnGetViewFactory(Intent intent)
    {
        int appWidgetId = intent.GetIntExtra(AppWidgetManager.ExtraAppwidgetId, AppWidgetManager.InvalidAppwidgetId);

        int mode = intent.GetIntExtra("Mode",0);
        int level = intent.GetIntExtra("Level",0);

        ListProvider lp = new ListProvider(this.ApplicationContext , mode , level);

        return lp;
    }
}

У меня есть класс widgetProvider для управления всеми действиями с виджетом.

[BroadcastReceiver(Label = "LifeApp")]
[IntentFilter(new string[] { "android.appwidget.action.APPWIDGET_UPDATE" })]
[MetaData("android.appwidget.provider", Resource = "@xml/widgetinfo")]
public class WidgetProvider : AppWidgetProvider
{

    private static string Button1Click = "Button1Click";
    private static string Button2Click = "Button2Click";

    private static int WidgetID;
    private static int[] WidgetID2;

   public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
   {

        WidgetID = appWidgetIds[0];
        WidgetID2 = appWidgetIds;

        RemoteViews remoteViews = updateWidgetListView(context, appWidgetIds[0], 0);

        //Button click events setting this method.
        RegisterClicks(context, appWidgetIds, remoteViews);

        appWidgetManager.UpdateAppWidget(appWidgetIds[0], remoteViews);

        base.OnUpdate(context, appWidgetManager, appWidgetIds);
   }


   public override void OnReceive(Context context, Intent intent)
   {
        base.OnReceive(context, intent);

        AppWidgetManager appWidgetManager = AppWidgetManager.GetInstance(context);

        RemoteViews remoteViews = new RemoteViews(context.PackageName, Resource.Layout.Main);

        if (Button1Click.Equals(intent.Action))
        {
            CustomWidgetButtonClickEvent(appWidgetManager, context, 0);

            remoteViews.SetOnClickPendingIntent(Resource.Id.Satis, GetPendingSelfIntent(context, SatisClick));
        }
        else if (Button2Click.Equals(intent.Action))
        {
            CustomWidgetButtonClickEvent(appWidgetManager, context, 1);
        }

    }


    private PendingIntent GetPendingSelfIntent(Context context, string action)
    {

        var intent = new Intent(context, typeof(WidgetProvider));
        intent.SetAction(action);
        return PendingIntent.GetBroadcast(context, 0 , intent, PendingIntentFlags.CancelCurrent);
    }



    public void CustomWidgetButtonClickEvent(AppWidgetManager appWidgetManager, Context context, int mode)
    {        
            RemoteViews remoteViews = updateWidgetListView(context, WidgetID, mode);

            appWidgetManager.UpdateAppWidget(WidgetID, remoteViews);                
    }




    private RemoteViews updateWidgetListView(Context context, int appWidgetId, int mode)
    {
        RemoteViews remoteViews = new RemoteViews(context.PackageName, Resource.Layout.Main);

        string PACKAGE_NAME = context.PackageName;

        Intent svcIntent = new Intent(context, typeof(WidgetService));
        svcIntent.SetPackage(PACKAGE_NAME);
        svcIntent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetId);
        svcIntent.PutExtra("Mode", mode);
        svcIntent.PutExtra("Level", 0);
        svcIntent.SetData(Android.Net.Uri.Parse(svcIntent.ToUri(Android.Content.IntentUriType.AndroidAppScheme)));


        remoteViews.SetEmptyView(Resource.Id.listViewBaslik, Resource.Id.empty_view);
        remoteViews.SetRemoteAdapter(appWidgetId, Resource.Id.listViewBaslik, svcIntent);


        Intent testIntent = new Intent(context, typeof(WidgetService));
        testIntent.SetPackage(PACKAGE_NAME);
        testIntent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetId);
        testIntent.PutExtra("Mode", mode);
        testIntent.PutExtra("Level", 1);
        testIntent.SetData(Android.Net.Uri.Parse(testIntent.ToUri(Android.Content.IntentUriType.AndroidAppScheme)));

        remoteViews.SetEmptyView(Resource.Id.listViewIcerik, Resource.Id.empty_view2);
        remoteViews.SetRemoteAdapter(appWidgetId, Resource.Id.listViewIcerik, testIntent);


        return remoteViews;
    }



   private void RegisterClicks(Context context, int[] appWidgetIds, RemoteViews widgetView)
    {
            var intent = new Intent(context, typeof(WidgetProvider));
            intent.SetAction(AppWidgetManager.ActionAppwidgetUpdate);
            intent.PutExtra(AppWidgetManager.ExtraAppwidgetIds, appWidgetIds);


        widgetView.SetOnClickPendingIntent(Resource.Id.Button1, GetPendingSelfIntent(context, Button1Click));
        widgetView.SetOnClickPendingIntent(Resource.Id.Button2, GetPendingSelfIntent(context, Button2Click));

    }
}

Мой Класс ListProvider как это

   public class ListProvider : Java.Lang.Object, RemoteViewsService.IRemoteViewsFactory
    {
    private List<Item> listItemList = new List<Item>();
    private Context context;

    private readonly int _mode;
    private readonly int _level;

    public ListProvider(Context contextNew , int mode , int level)
    {
        _mode = mode;
        _level = level;

        context = contextNew;




        DataLoad();
    }


    private void DataLoad()
    {
        var DataList = GlobalVar.LifeService.Life_getAnlikSatisAuth("XXX", "XXX");

        foreach (Item item in DataList)
        {
            if (item.Mode == _mode && item.Level == _level)
            {
                listItemList.Add(new MudoAnlık
                {
                    Mode = item.Mode,
                    Level = item.Level,
                    LevelKey = item.LevelKey,
                    LevelText = item.LevelText,
                    RowNumber = item.RowNumber,
                    Image = item.Image,
                    Column1 = item.Column1,
                    Column2 = item.Column2,
                    Column3 = item.Column3
                });
            }
        }
    }




    public int Count { get { return listItemList.Count; } }
    public long GetItemId(int position)
    {
        return position;
    }
    public RemoteViews GetViewAt(int position)
    {
        RemoteViews remoteView = new RemoteViews(context.PackageName, Resource.Layout.listview_row);


        Item listItem = listItemList[position];

        remoteView.SetTextViewText(Resource.Id.txtName2, listItem.LevelText);
        remoteView.SetTextViewText(Resource.Id.txtName3, listItem.Column1);
        remoteView.SetTextViewText(Resource.Id.txtName4, listItem.Column2);

        if (listItem.Image.ToString().Contains("up"))
        {
            remoteView.SetImageViewResource(Resource.Id.imageOk,Resource.Drawable.up);
        }
        else
        {
            remoteView.SetImageViewResource(Resource.Id.imageOk, Resource.Drawable.down);
        }

        remoteView.SetTextViewText(Resource.Id.txtName5, listItem.Column3);

        return remoteView;
    }
    public RemoteViews LoadingView { get { return null; } }
    public int ViewTypeCount { get { return 1; } }
    public bool HasStableIds { get { return true; } }
    public void OnCreate()
    {
       // throw new NotImplementedException();
    }
    public void OnDataSetChanged()
    {
       // throw new NotImplementedException();
    }
    public void OnDestroy()
    {
       // throw new NotImplementedException();
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...