Xamarin.Android: изменение определенного значения в списке во время выполнения - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть простое Xamarin.Android-приложение.

В разделе «Активность» этого приложения отображается список.Пожалуйста, смотрите следующий MyActivity.axml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android        ="http://schemas.android.com/apk/res/android"
android:orientation  ="vertical"
android:layout_width ="match_parent"
android:layout_height="match_parent">
<Button
    android:layout_width ="match_parent"
    android:layout_height="wrap_content"
    android:text         ="Click Me"
    android:layout_marginTop   ="20dp"
    android:layout_marginLeft   ="25dp"
    android:layout_marginRight   ="25dp"
    android:id="@+id/button" />
<Space
    android:layout_width="match_parent"
    android:layout_height="25dp"
    android:id="@+id/space" />
<ListView
    android:minWidth="25px"
    android:minHeight="25px"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/list" />
</LinearLayout>

Одна строка этого списка содержит просто две записи, пожалуйста, смотрите ListRow.axml:

<?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">        
    <TextView             
        android:id="@+id/name"            
        android:layout_width="wrap_content"          
        android:layout_height="wrap_content" 
        android:layout_marginLeft  ="5dp"
        android:layout_marginTop   ="10dp"
        android:layout_marginBottom="10dp"
        android:layout_marginRight ="5dp" />
    <TextView             
        android:id="@+id/value"            
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_marginLeft  ="5dp"
        android:layout_marginTop   ="10dp"
        android:layout_marginBottom="10dp"
        android:layout_marginRight ="5dp" />
</RelativeLayout>

Так что код этого действия выглядитнапример:

public class MyActivity : Activity
{
    List<Entry> List = null;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        SetContentView(Resource.Layout.MyActivity);

        List = PopulateList();
        var lv = FindViewById<ListView>(Resource.Id.list);
        var adapter = new ListAdapter(this, Resource.Layout.List, List);
        lv.Adapter = adapter;

        FindViewById<Button>(Resource.Id.button).Click += OnButtonClick;
    }
}

Для полноты, вот код для моего ListAdapter.cs-класса:

class ListAdapter : ArrayAdapter
{
    List<Entry> List;
    public ListAdapter(Context Context, int ListId, List<Entry> List) : base(Context, ListId, List)
    {
        this.List = List;
    }
    public override int Count
    {
        get { return List.Count; }
    }
    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);
        }
        v.FindViewById<TextView>(Resource.Id.name).Text = List[position].Name;
        v.FindViewById<TextView>(Resource.Id.value).Text = "Original Value";
        return v;
    }
}

Итак, мой вопрос теперь следующий: предположим, чтов этом списке более одного элемента.При нажатии кнопки я хочу изменить один конкретный текст в этом списке.Скажем, вторая запись в списке (Resource.Id.value) .Text (которая теперь говорит «Исходное значение») в «Измененное значение» или что-то в этом роде.Но только второго.Все остальные предметы должны оставаться такими же.

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

Имя Значение- - - - - - - - - - - - - - - -№ 1 Исходное значениеNo.2 Исходное значение№ 3 Исходное значение

[Нажатие кнопки]

Имя Значение- - - - - - - - - - - - - - - -№ 1 Исходное значение№ 2 измененное значение№ 3 Исходное значение

Может кто-нибудь может мне помочь / подсказать, как это сделать?Как должен выглядеть мой private void OnButtonClick(object sender, EventArgs e) -метод?Как я могу получить доступ к одной записи в этом списке?

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

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы можете добавить метод в адаптере к notifyDataSetChanged();:

class ListAdapter : ArrayAdapter
    {
      List<Entry> List;
      private int ItemPositionToChange = -1;
      public ListAdapter(Context Context, int ListId, List<Entry> List) : 
          base(Context, ListId, List)
        {
          this.List = List;
        }

      //this method to let adapter notify
      public void ChangeItemValue(int position)
        {
            ItemPositionToChange = position;
            NotifyDataSetChanged();
        }

      public override int Count
        {
          get { return List.Count; }
        }
      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);
            }
              v.FindViewById<TextView>(Resource.Id.name).Text = List[position].Name;

              //change the item value according to your needs
              if(position == ItemPositionToChange ){
                v.FindViewById<TextView>(Resource.Id.value).Text = "Changed Value";
              }else{
                v.FindViewById<TextView>(Resource.Id.value).Text = "Original Value";
              }

              return v;
           }
    }

, затем в вашем слушателе нажатия кнопки:

void OnButtonClick(object sender, EventArgs e)
    {
       //positionToChange is which item you want to change
       adapter.ChangeItemValue(positionToChange);
    }
0 голосов
/ 01 февраля 2019

Я не слишком знаком с классом Entry, но, похоже, у него есть свойство Text.

Предполагается, что вы знаете индекс строки (myIndex ниже):

private void OnButtonClick(object sender, EventArgs e) {
    List[myIndex].Text = "Changed Value";
    adapter.notifyDataSetChanged();
}
...