YauheniLazakovich
YauheniLazakovich

Reputation: 23

How to save selected item color in RecyclerView

My question is: how to save selected item color in RecyclerView. I have an Activity, where is the RecyclerView. If button in RecyclerView is clicked, the app navigates to another Activity (StartActivityForResult()). I get the item and color, which was selected, and set this item and color to RecyclerViewAdapter. But every time, my RecyclerView redraws and set the background color of all items except selected item to default. I don't know, where I should install default background color. I want to save all selected items colors in RecyclerView.

My Activity:

[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);
    }
}

My RecyclerViewHolder and Adapter

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);
        }

    }
}

My Second Activity

[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

Here I select a new item, set the color an another Activity, and came back, but previous selected item color was changed to default white color.

enter image description here

Upvotes: 0

Views: 162

Answers (1)

Muhammed Aydogan
Muhammed Aydogan

Reputation: 660

Save all values from your Adapter. Override onActivityResult or onStart method and set all values you saved again one by one and execute this yourAdapter.notifyDataSetChanged().

Upvotes: 0

Related Questions