Изменение BackgroundResource объекта ListView, когда он находится вне экрана - PullRequest
0 голосов
/ 09 февраля 2020

newb ie выполняя здесь задание курса.

Я создаю приложение Xamarin C#, в котором вы создаете список объектов, которые отображаются в пользовательском интерфейсе с целью отслеживания поворотов в настольной / настольной игре. Чтобы показать, кому принадлежит их очередь, когда вы нажимаете кнопку rotateButton, у объекта, который имеет свою очередь, цвет ячейки ListView меняется, в то время как остальные имеют белый цвет. Если экран слишком маленький или на нем есть какие-либо объекты, приложение падает при нажатии кнопки rotateButton.

Как предотвратить эту ошибку sh? Могу ли я сохранить данные в памяти, чтобы при прокрутке вниз единицы измерения были синего цвета? Способен ли ListView к этому?

Вот как работает кнопка

Button _rotateButton = FindViewById<Button>(Resource.Id.rotateButton);
        int rotatePrevious = -1;
        int rotateCurrent = 0;

        _rotateButton.Click += delegate
        {
            int rotateCount = ItemUnits.Count();

            if(rotateCount != 0)
            { 

            if (rotateCurrent == 0)
            {
                _rotateButton.Text = "End Turn";

            }

            if(rotatePrevious != -1)
                {
                    ItemUnits[rotatePrevious].IsSelected = false;
                }

                if (rotateCurrent == rotateCount)
                {

                    foreach(ItemUnit iu in ItemUnits)
                    {
                        iu.IsSelected = false;
                        View inactiveView = listView.GetChildAt(ItemUnits.IndexOf(iu));
                        inactiveView.SetBackgroundResource(Resource.Color.colorPrimary);
                    }
                    rotateCurrent = 0;
                    rotatePrevious = -1;
                    _rotateButton.Text = "New Round";
                }

                else
                {
                    ItemUnits[rotateCurrent].IsSelected = true;

                    foreach (ItemUnit iu in ItemUnits)
                    {
                        if (iu.IsSelected == true)
                        {
                            View activeView = listView.GetChildAt(ItemUnits.IndexOf(iu));
                            activeView.SetBackgroundResource(Resource.Color.colorAccent);
                        }
                        else
                        {
                            View inactiveView = listView.GetChildAt(ItemUnits.IndexOf(iu));
                            inactiveView.SetBackgroundResource(Resource.Color.colorPrimary);
                        }

                    }


                    rotateCurrent++;
                    rotatePrevious++;

                    if (rotateCurrent == rotateCount)
                    {
                        _rotateButton.Text = "End Round";
                    }
                }

            }

1 Ответ

0 голосов
/ 10 февраля 2020

Хотите ли вы добиться результата, подобного следующему GIF?

enter image description here

Если это так, вы можете добавить метод setSelectedId в адаптер. Затем измените цвет фона, как показано в следующем коде.

   public class ListViewAdapter : BaseAdapter<Meeting>
{
    private Activity activity;
    private List<Meeting> listMeeting;
    public ListViewAdapter(Activity activity, List<Meeting> listMeeting)
    {
        this.activity = activity;
        this.listMeeting = listMeeting;
    }

    public override Meeting this[int position] => listMeeting[position];

    public override int Count
    {
        get { return listMeeting.Count; }
    }

    public override long GetItemId(int position)
    {
        return listMeeting[position].Id;
    }
    private int selectedId = -1;
    public void setSelectedId(int position)
    {
        selectedId = position;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView;
        if (view == null) // no view to re-use, create new
            view = activity.LayoutInflater.Inflate(Resource.Layout.list_view, null);


        var txtName = view.FindViewById<TextView>(Resource.Id.idLogin);
        var txtDepart = view.FindViewById<TextView>(Resource.Id.idContact);
        var txtEmail = view.FindViewById<TextView>(Resource.Id.Place);
        txtName.Text = listMeeting[position].idLogin.ToString();
        txtDepart.Text = listMeeting[position].idContact.ToString();
        txtEmail.Text = listMeeting[position].Place;

        if (selectedId == position)
        {
            view.SetBackgroundColor(Color.Red);

        }
        else
        {
            view.SetBackgroundColor(Color.Transparent);

        }


        return view;
    }


}

Используйте этот метод, измените цвет на Postion.

    private void BtnAdd_Click(object sender, EventArgs e)
    {
        adapter.setSelectedId(Int32.Parse(edtidLogin.Text));
        adapter.NotifyDataSetChanged();
    }

Вот мой код Actvity.

     protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);
        lstViewData = FindViewById<ListView>(Resource.Id.listView);
         edtidLogin = FindViewById<EditText>(Resource.Id.edtidLogin); 
        var btnChange = FindViewById<Button>(Resource.Id.btnChange);
        listSource.Add(new Meeting() { idContact=1, idLogin=1, Place="test1" });
        listSource.Add(new Meeting() { idContact = 2, idLogin = 1, Place = "test2" });
        listSource.Add(new Meeting() { idContact = 3, idLogin = 1, Place = "test3" });
        listSource.Add(new Meeting() { idContact = 4, idLogin = 1, Place = "test4" });
        listSource.Add(new Meeting() { idContact = 5, idLogin = 1, Place = "test5" });
        listSource.Add(new Meeting() { idContact = 6, idLogin = 1, Place = "test6" });
        listSource.Add(new Meeting() { idContact = 7, idLogin = 1, Place = "test7" });
        listSource.Add(new Meeting() { idContact = 8, idLogin = 1, Place = "test8" });
        listSource.Add(new Meeting() { idContact = 9, idLogin = 1, Place = "test9" });
        listSource.Add(new Meeting() { idContact = 10, idLogin = 1, Place = "test10" });
        listSource.Add(new Meeting() { idContact = 11, idLogin = 1, Place = "test11" });
        listSource.Add(new Meeting() { idContact = 12, idLogin = 1, Place = "test12" });
        listSource.Add(new Meeting() { idContact = 13, idLogin = 1, Place = "test13" });
        listSource.Add(new Meeting() { idContact = 14, idLogin = 1, Place = "test14" });
        listSource.Add(new Meeting() { idContact = 15, idLogin = 1, Place = "test15" });
        listSource.Add(new Meeting() { idContact = 16, idLogin = 1, Place = "test16" });

        adapter = new ListViewAdapter(this, listSource);
        lstViewData.Adapter = adapter;

        btnChange.Click += BtnAdd_Click;

    }

    private void BtnAdd_Click(object sender, EventArgs e)
    {
        adapter.setSelectedId(Int32.Parse(edtidLogin.Text));
        adapter.NotifyDataSetChanged();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...