Ошибки MonoDroid с ListView.ItemClick и AddFooterView - PullRequest
1 голос
/ 19 октября 2011

Я обнаружил несколько проблем с ListViews в Mono для Android, которые могут быть ошибками.Я опубликовал довольно простой проект, который более подробно демонстрирует обе эти проблемы здесь: Пример проекта

Мне интересно, если я делаю что-то не так или это законные ошибки.


Сначала , если вы пытаетесь использовать завышенное представление в качестве представления нижнего колонтитула для ListView, вызывая AddFooterView, он генерирует исключение ClassCastException.Использование динамически создаваемого представления работает нормально, но вы не можете применять стили к динамически создаваемому представлению .Так что это работает нормально:

goodButton.Click += delegate {
    TextView tv = new TextView(this);
    tv.Text = "THIS IS THE LIST FOOTER";
    listView.AddFooterView(tv);
    listView.Adapter = adapter;
    Toast.MakeText(this, "Footer was added...", ToastLength.Short).Show();
};

Но это вызывает исключение ClassCastException:

TextView footerViewButton = FindViewById(Resource.Id.listFooterButton) as TextView;
badButton.Click += delegate {
    listView.AddFooterView(footerViewButton);
    listView.Adapter = adapter;
    Toast.MakeText(this, "Custom Footer was moved...", ToastLength.Short).Show();
};

Second , если вы создаете ListView и устанавливаете дескриптор ItemClick,затем вызовите NotifyDataSetChanged () для ListView, событие ItemClick больше не вызывается:

protected override void OnCreate(Bundle bundle) {
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.ItemClick);
    ListView list = FindViewById(Resource.Id.itemClickList) as ListView;
    mAdapter = new CustomAdapter(this, Countries);
    list.Adapter = mAdapter;
    list.ItemClick += new EventHandler<ItemEventArgs>(list_ItemClick);
}

CustomAdapter вызывает этот метод в действии, когда отображается последнее представление в списке:

public void GetMoreListItems() {
    if (mAdapter.Count < Countries.Length + MoreCountries.Length) {
        string[] allCountries = new string[Countries.Length + MoreCountries.Length];
        Countries.CopyTo(allCountries, 0);
        MoreCountries.CopyTo(allCountries, Countries.Length);
        mAdapter.NotifyDataSetChanged(allCountries);
        Toast.MakeText(this, "New items were loaded. Now Click action is broken.", ToastLength.Short).Show();
    }
}

1 Ответ

1 голос
/ 20 октября 2011

1) проблема не является ошибкой. Если вы хотите использовать стили для представления нижнего колонтитула, вы можете создать для него макет XML, а затем использовать LayoutInflater для его создания и добавления в качестве представления нижнего колонтитула в список.

var footerView = LayoutInflater.Inflate(Resource.Layout.footerView,null);
listView.AddFooterView(footerView);

2) У меня также была проблема с этим, и я потратил некоторое время, пытаясь найти проблему. В конце концов я решил проигнорировать это и использовать NotifyDataSetChanged() метод без параметров. И чтобы обновить адаптер, я создал метод что-то вроде .SetItems(IEnumerable<TItem> items). Итак, мой код выглядит так:

var newItems=Service.LoadNewItems();
adapter.SetItems(newItems);
adapter.NotifyDataSetChanged();

И у меня все отлично работает. Вызывается делегат ListItemClick.

...