Xamarin.Android: автоматически обновляет отображение ImageView без повторного вызова всей активности - PullRequest
0 голосов
/ 09 января 2019

В моем Xamarin.Android-приложении при открытии специальной страницы (действия) при создании отображается таблица. ListAdapter определяет определенные поля в этой таблице. У меня есть функция, которая дает мне внешний int. Int входит в число других данных, отображаемых в этой таблице. Но эта функция вызывается только один раз (при создании). Как я могу вызвать эту функцию во время выполнения в течение определенного интервала времени? Я хочу, чтобы, если полученное значение int изменилось, отображение int в таблице также изменилось без повторного вызова всей операции.

Может кто-нибудь может мне помочь и подсказать, как это сделать? Это было бы очень любезно!

Пожалуйста, позвольте мне поделиться некоторым кодом, чтобы вам было легче понять меня:

Resource.Layout.Activity:

<LinearLayout>
    [...]
    <ListView
        android:visibility="gone"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/ListView" />
</LinearLayout> 

Активность:

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.Activity);
    [...]    
    var lv = FindViewById<ListView>(Resource.Id.ListView);
    lv.Adapter = new ListAdapter(this, Resource.Layout.List, list.CurrentList, Intent.GetStringExtra("ServerIP"));
}

Resource.Layout.List:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"     
android:orientation="horizontal"     
android:layout_width="fill_parent"     
android:layout_height="fill_parent">

[...]

<ImageView         
    android:id="@+id/ImageView" />

</RelativeLayout>

Класс ListAdapter: ArrayAdapter

public ListAdapter(Context Context, int ListId, List<Geraet> list, string serverip) : base(Context, ListId, Geraete)
{ 
    this.List = list; 
}

[...]

public override View GetView(int position, View convertView, ViewGroup parent)
{
    View v = convertView;
    if (v == null)
    {
        LayoutInflater inflater = (LayoutInflater) Context.GetSystemService(Context.LayoutInflaterService);
        v = inflater.Inflate(Resource.Layout.List, parent, false);
    }
    if (Get_Status(List[position]) == 1)
    {
        v.FindViewById<ImageView>(Resource.Id.ImageView).SetImageResource(Resource.Drawable.green);
    }
    if (Get_Status(List[position]) != 1)
    {
        v.FindViewById<ImageView>(Resource.Id.ImageView).SetImageResource(Resource.Drawable.red);
    }
}

[...]

private int Get_Status(Geraet geraet)
{
    var request = HttpWebRequest.Create(string.Format(Constants.StatusPath, Serverip, Constants.WebservicePort, geraet.Ip));
    request.ContentType = "application/json";
    request.Method = "GET";

    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            var content = reader.ReadToEnd();

            var result = System.Text.RegularExpressions.Regex.Replace(content, @"[^0-9]", "");

            if (result == string.Empty)
            {
                return -2;
            }
            else
            {
                return Int32.Parse(result);
            }
        }
    }
}

Спасибо за ответы заранее и с наилучшими пожеланиями

1 Ответ

0 голосов
/ 09 января 2019

Вы можете сделать это с помощью System.Threading:

var thread = new Thread(() => MethodToRun(garaet));
thread.Start();

Запустите указанный выше код в OnCreate(). В MethodToRun() вы можете делать все, что захотите. Например:

void MethodToRun(Garaet garaet) {
    while(true) {
        Thread.Sleep(1000);
        Activity.RunOnUiThread((garaet) => { [...] });
    }
}

В этом случае [...] будет запускаться каждую секунду в потоке пользовательского интерфейса. Замените это кодом, который обрабатывает обновление изображения.

...