Изменить один элемент ListView

Я застрял на изменении одной строки в заполненном ListView в течение нескольких дней и пробовал множество (java) решений, найденных здесь, а также на xamarin, но будучи студентом, я часто вижу решения, публикуемые без надлежащей документации о том, как и почему это работает. До сих пор я создал этот пользовательский адаптер для стандартного ListView:

//How I initialize the Adapter and ListView
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            SetContentView(Resource.Layout.Main);


            List<string> online = new List<string>();
            CustomAdapter lvOnlineAdapter = new CustomAdapter(this, online);
            ListView lvOnline = FindViewById<ListView>(Resource.Id.lvOnline);
            lvOnline.Adapter = lvOnlineAdapter;

            lvOnlineAdapter.Add("Test1");
            lvOnlineAdapter.Add("Test2");
            lvOnlineAdapter.Add("Test3");

            for(int i = 0; i < lvOnlineAdapter.Count; i++)
                lvOnlineAdapter.EditItem(i, "Test " + i + " Description")

            lvOnlineAdapter.NotifyDataSetChanged();
        }




    public class CustomAdapter : BaseAdapter<string> 
{
    List<string> items;
    Activity context;
    public CustomAdapter(Activity context, List<string> items) : base() 
    {
        this.context = context;
        this.items = items;
    }
    public void Add(string itemToAdd)
    {
        items.Add (itemToAdd);
    }
    public void Remove(string itemToRemove)
    {
        items.Remove (itemToRemove);
    }
    public void Remove(int position)
    {
        items.RemoveAt(position);
    }
    public override long GetItemId(int position)
    {
        return position;
    }
    public void EditItem(int Position, string Text2)
    {  //Here is my problem, it does not change anything
        View view = GetView (Position, null, null);
        view.FindViewById<TextView>(Android.Resource.Id.Text1).Typeface = Typeface.DefaultBold;
        view.FindViewById<TextView>(Android.Resource.Id.Text1).SetBackgroundColor(Color.Yellow);
        view.FindViewById<TextView>(Android.Resource.Id.Text2).Text = Text2;
    }
    public override string this[int position] 
    {  
        get { return items[position]; }
    }
    public override int Count 
    {
        get { return items.Count; }
    }
    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView; // re-use an existing view, if one is available
        if (view == null) // otherwise create a new one
            view = context.LayoutInflater.Inflate(Android.Resource.Layout.SimpleListItem2, null);

        view.FindViewById<TextView>(Android.Resource.Id.Text1).Text = items[position];
        return view;
    }
}

Моя проблема в том, что когда я использую EditItem, он ничего не меняет, может кто-нибудь объяснить, почему он не работает и что мне нужно сделать, чтобы он работал? заранее спасибо


person Roy    schedule 24.05.2013    source источник


Ответы (1)


person    schedule
comment
Извините, я должен был сказать, что инициализировал его и добавил список, вопрос отредактирован. - person Roy; 24.05.2013
comment
Я надеюсь, что я сделал это достаточно ясно, чтобы понять для вас, спасибо за помощь - person Roy; 24.05.2013
comment
Но я не хочу менять его на ItemClick, но когда, например, устройство получает уведомление от пользователя, который находится в ListView. Так пользователь увидит, какому пользователю пришло уведомление. Проблема в том, что сейчас я не могу изменить текст после его добавления в ListView, или я упустил вашу мысль? - person Roy; 24.05.2013
comment
теперь я понимаю, вам нужно поставить NotifyDataSetChanged(); в ваших адаптерах добавьте метод - person Liviu; 24.05.2013
comment
Я не думаю, что вы понимаете мою проблему, я не могу изменить одну строку с помощью SetNotification (int Position, string Text2). Не добавляйте и не удаляйте элементы, потому что это работает. - person Roy; 24.05.2013
comment
создайте метод Edit(String itemToEdit) и поместите в него NotifyDataSetChanged() после изменения элемента - person Liviu; 24.05.2013
comment
Ну да, но вопрос именно в этом: EditItem (я переименовал метод SetNotification, чтобы прояснить его) не изменяет отображаемый элемент. Я ценю вашу помощь. - person Roy; 24.05.2013
comment
это потому, что вы не вызываете EditItem в своем коде. Вам нужно вызвать EditItem вместо lvOnlineAdapter.NotifyDataSetChanged();. Также я думаю, вам нужно изменить элемент из списка, чтобы он работал, а не TextView - person Liviu; 24.05.2013
comment
Ну я только показал как я его инициализировал и как у меня не будет полностью работать переходник, я расширил пример. - person Roy; 24.05.2013
comment
как я уже сказал, попробуйте изменить элемент в позиции, а не в TextView, и добавьте NotitfyDataSetChanged(), ваш метод EditItem должен выглядеть так, как в моем ответе. - person Liviu; 24.05.2013
comment
Это действительно хорошо работает, спасибо :). Однако я хотел бы изменить такое свойство, как Bold или BackColor, чтобы сделать изменение более очевидным, и установить вторую строку текста в simpleListItem2. - person Roy; 24.05.2013
comment
Я думаю, что все ваши TextViews будут иметь один и тот же идентификатор, поэтому это единственный обходной путь, который приходит на ум. Получите весь TextView из макета и посмотрите, какой из них содержит текст, который вы изменили. Проблема возникает, если у вас будет более 1 поля с этим текстом. Я начал работать с Android всего несколько дней назад, поэтому скажите, поможет ли это, если нет, я продолжу поиск - person Liviu; 24.05.2013
comment
Отлично работает с simpleListItem1, спасибо: D - person Roy; 24.05.2013