Reputation: 23
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();
};
}
}
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.
Upvotes: 0
Views: 162
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