Как сохранить выбранный цвет элемента в RecyclerView - PullRequest
0 голосов
/ 29 марта 2020

Мой вопрос: как сохранить выбранный цвет элемента в RecyclerView. У меня есть Activity, где RecyclerView. Если нажать кнопку RecyclerView, приложение перейдет к другому Activity (StartActivityForResult()). Я получаю предмет и цвет, который был выбран, и устанавливаю этот предмет и цвет на RecyclerViewAdapter. Но каждый раз, мой RecyclerView redr aws и устанавливает цвет фона всех элементов, кроме выбранного элемента, по умолчанию. Я не знаю, где я должен установить цвет фона по умолчанию. Я хочу сохранить все выбранные цвета элементов в RecyclerView.

Моя активность:

[Activity(Label = "LedControlPageActivity", Theme = "@/style/AppTheme.NoActionBar", MainLauncher = false)]
public class LedControlPageActivity : AppCompatActivity
{
    private int _number;
    private RecyclerView _recycler;
    private RecyclerViewAdapter _adapter;
    private RecyclerView.LayoutManager _layoutManager;
    private List<ImageView> _btnList;
    private ImageView _imgView;
    private int _selectedItem;
    private int _selectedColor;

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.ledcontrolpage);
        _number = Intent.GetIntExtra("SelectedNumber", 0);

        var button1 = FindViewById<Button>(Resource.Id.mode1);
        var button2 = FindViewById<Button>(Resource.Id.mode2);
        var button3 = FindViewById<Button>(Resource.Id.mode3);
        var button4 = FindViewById<Button>(Resource.Id.mode4);
        var button5 = FindViewById<Button>(Resource.Id.mode5);
        var button6 = FindViewById<Button>(Resource.Id.mode6);
        var button7 = FindViewById<Button>(Resource.Id.mode7);
        var button8 = FindViewById<Button>(Resource.Id.mode8);
        var button9 = FindViewById<Button>(Resource.Id.mode9);
        Typeface _buttonTypeFace = Typeface.CreateFromAsset(Assets, "Montserrat.ttf");
        button1.SetTypeface(_buttonTypeFace, TypefaceStyle.Normal);
        button2.SetTypeface(_buttonTypeFace, TypefaceStyle.Normal);
        button3.SetTypeface(_buttonTypeFace, TypefaceStyle.Normal);
        button4.SetTypeface(_buttonTypeFace, TypefaceStyle.Normal);
        button5.SetTypeface(_buttonTypeFace, TypefaceStyle.Normal);
        button6.SetTypeface(_buttonTypeFace, TypefaceStyle.Normal);
        button7.SetTypeface(_buttonTypeFace, TypefaceStyle.Normal);
        button8.SetTypeface(_buttonTypeFace, TypefaceStyle.Normal);
        button9.SetTypeface(_buttonTypeFace, TypefaceStyle.Normal);

        _btnList = new List<ImageView>();
        _imgView = FindViewById<ImageView>(Resource.Id.imgView);

        for (int i = 0; i < _number; i++)
        {
            _btnList.Add(_imgView);

        }
        _recycler = FindViewById<RecyclerView>(Resource.Id.recyclerview);

        _recycler.HasFixedSize = true;
        _layoutManager = new GridLayoutManager(this, 10);
        _recycler.SetLayoutManager(_layoutManager);


    }
    protected override void OnResume()
    {
        base.OnResume();



        _adapter = new RecyclerViewAdapter(_btnList, this, _selectedItem, _selectedColor);

        _recycler.SetAdapter(_adapter);

    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        _selectedColor = data.GetIntExtra("selectedColor", 0);
        _selectedItem = data.GetIntExtra("selectedItem", 0);
    }
}

Мой RecyclerViewHolder и адаптер

public class RecyclerViewHolder : RecyclerView.ViewHolder, View.IOnClickListener, View.IOnLongClickListener
{
    public ImageView Button { get; set; }
    public ImageView ButtonSmall { get; set; }

    private IItemClickListener _itemClickListener;

    public RecyclerViewHolder(View itemView) : base(itemView)
    {
        Button = itemView.FindViewById<ImageView>(Resource.Id.imgView);
        ButtonSmall = itemView.FindViewById<ImageView>(Resource.Id.imgViewSmall);

        itemView.SetOnClickListener(this);
        itemView.SetOnLongClickListener(this);
    }

    public void SetItemClickListener(IItemClickListener itemClickListener)
    {
        _itemClickListener = itemClickListener;
    }

    public bool OnLongClick(View v)
    {
        _itemClickListener.OnClick(v, AdapterPosition, true);
        return true;
    }

    public void OnClick(View v)
    {
        _itemClickListener.OnClick(v, AdapterPosition, false);
    }
}

public class RecyclerViewAdapter : RecyclerView.Adapter, IItemClickListener
{
    private List<ImageView> _btnList = new List<ImageView>();
    private Context _context;
    private RecyclerViewHolder viewHolder;
    private int _selectedItem;
    private int _color;

    public RecyclerViewAdapter(List<ImageView> btnList, Context context, int selectedItem, int selectedColor)
    {
        _btnList = btnList;

        _context = context;
        _selectedItem = selectedItem;
        _color = selectedColor;
    }

    public override int ItemCount
    {
        get
        {
            return _btnList.Count;
        }
    }



    public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {

        viewHolder = holder as RecyclerViewHolder;
        if (_btnList.Count < 61)
        {
            viewHolder.Button.SetBackgroundResource(Resource.Drawable.circleimage);
        }
        else
            viewHolder.ButtonSmall.SetBackgroundResource(Resource.Drawable.circleimagesmall);
        viewHolder.SetItemClickListener(this);


        int blue;
        int green;
        int red;

        Android.Graphics.Color color;
        if (position == _selectedItem)
        {
            blue = _color & 255;
            green = (_color >> 8) & 255;
            red = (_color >> 16) & 255;
            color = Android.Graphics.Color.Rgb(red, green, blue);

            if(viewHolder.Button != null)
                viewHolder.Button.SetBackgroundColor(color);
            if(viewHolder.ButtonSmall != null)
                viewHolder.ButtonSmall.SetBackgroundColor(color);
        }
    }

    public void OnClick(View itemView, int position, bool isLongClick)
    {
        Context context = itemView.Context;
        Intent intent = new Intent(context, typeof(ColorPickerActivity));
        intent.PutExtra("selected", position);
        NotifyItemChanged(position);
        ((LedControlPageActivity)context).StartActivityForResult(intent, 1);
    }

    public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
    {

        LayoutInflater inflater = LayoutInflater.From(parent.Context);
        if (_btnList.Count < 61)
        {
            View itemView = inflater.Inflate(Resource.Layout.imglayout, parent, false);
            GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
            lp.SetMargins(20, 20, 20, 20);
            lp.Width = 100;
            lp.Height = 100;
            itemView.LayoutParameters = lp;
            return new RecyclerViewHolder(itemView);
        }
        else
        {
            View itemViewSmall = inflater.Inflate(Resource.Layout.imglayoutsmall, parent, false);
            GridLayout.LayoutParams lp = new GridLayout.LayoutParams();
            lp.SetMargins(15, 15, 15, 15);
            lp.Width = 65;
            lp.Height = 65;
            itemViewSmall.LayoutParameters = lp;
            return new RecyclerViewHolder(itemViewSmall);
        }

    }
}

Мое второе занятие

[Activity(Label = "ColorPickerActivity", Theme = "@/style/AppTheme.NoActionBar", MainLauncher = false)]
public class ColorPickerActivity : AppCompatActivity
{
    Com.Flask.Colorpicker.ColorPickerView _colorPickerView;
    Button _okButton;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.pickerlayout);

        _okButton = FindViewById<Button>(Resource.Id.okbutton);

        _colorPickerView = FindViewById<Com.Flask.Colorpicker.ColorPickerView>(Resource.Id.color_picker_view);


    }

    protected override void OnResume()
    {
        base.OnResume();
        var selectedItem = Intent.GetIntExtra("selected", 0);
        _okButton.Click += (s, e) =>
        {
            Intent intent = new Intent(this, typeof(LedControlPageActivity));
            intent.PutExtra("selectedColor", _colorPickerView.SelectedColor);
            intent.PutExtra("selectedItem", selectedItem);
            intent.PutExtra("SelectedNumber", 5);
            SetResult(Result.Ok, intent);
            Finish();
        };
    }

}

enter image description here

Здесь я выбираю новый элемент, устанавливаю цвет и еще один Activity и вернулся, но цвет предыдущего выбранного элемента был изменен на белый цвет по умолчанию.

enter image description here

1 Ответ

0 голосов
/ 29 марта 2020

Сохранить все значения из вашего Adapter. Переопределите метод onActivityResult или onStart и установите все значения, которые вы сохранили снова, по одному и выполните этот yourAdapter.notifyDataSetChanged().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...