Skip to content

Instantly share code, notes, and snippets.

@MilenPavlov
Created April 16, 2015 08:24
Show Gist options
  • Save MilenPavlov/63b49cdac893fdaa73c4 to your computer and use it in GitHub Desktop.
Save MilenPavlov/63b49cdac893fdaa73c4 to your computer and use it in GitHub Desktop.
Horizontal ScrollView for (Xamarin) Android using RecyclerView and GridLayoutManager
//MainActivity's private vars and key methods:
public class MainActivity : FragmentActivityBase
{
private RecyclerView _recyclerViewPhotosTakenEdit;
private IList<PhotoItemModel> _photoItemsModel;
private RecyclerView.LayoutManager _layoutManager;
private PhotoQuestionRecyclerAdapter _photoQuestionImageAdapter;
......
}
private void AttachControlls()
{
_recyclerViewPhotosTakenEdit = FindViewById<RecyclerView>(Resource.Id.recyclerViewPhotoQuestionImagesEdit);
_layoutManager = new GridLayoutManager(this, 1, GridLayoutManager.Horizontal, false);
_recyclerViewPhotosTakenEdit.SetLayoutManager(_layoutManager);
}
private void PopulateRecyclerViewAdapterData()
{
_photoQuestionImageAdapter = new PhotoQuestionRecyclerAdapter(this, _photoItemsModel, false);
_recyclerViewPhotosTakenEdit.SetAdapter(_photoQuestionImageAdapter);
}
//PhotoQuestionRecyclerAdapter code:
public class PhotoQuestionRecyclerAdapter : RecyclerView.Adapter
{
public event EventHandler<int> ItemClick;
private readonly Activity _context;
private readonly IList<PhotoItemModel> _photoItems;
private readonly bool _showSelected;
public PhotoQuestionRecyclerAdapter(Activity context, IList<PhotoItemModel> photoItems, bool showSelected = true)
{
_context = context;
_photoItems = photoItems;
_showSelected = showSelected;
}
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
if (!_photoItems.Any()) return;
if (holder != null)
{
var photoItemModel = _photoItems[position];
(holder as PhotoItemViewHolder).ImageDescriptionTextView.SetText(photoItemModel.PhotoItem.Description,
TextView.BufferType.Normal);
(holder as PhotoItemViewHolder).ImageView.SetImageBitmap(
BitmapFactory.DecodeByteArray(photoItemModel.PhotoItem.Image, 0,
photoItemModel.PhotoItem.Image.Length));
if (_showSelected)
(holder as PhotoItemViewHolder).ImageSelectedCheckBox.Selected = photoItemModel.Selected;
}
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View view = LayoutInflater.From(parent.Context)
.Inflate(Resource.Layout.RecyclerViewItemTemplate, parent, false);
PhotoItemViewHolder photoItemViewHolder = new PhotoItemViewHolder(view, OnClick, _photoItems, _showSelected);
return photoItemViewHolder;
}
void OnClick(int position)
{
ItemClick?.Invoke(this, position);
}
public override int ItemCount => _photoItems.Count;
public void ToggleItemSelection(int position, RecyclerView currentView)
{
var photoItemModel = _photoItems[position];
photoItemModel.Selected = !photoItemModel.Selected;
var viewHolder = currentView?.FindViewHolderForAdapterPosition(position) as PhotoItemViewHolder;
if (viewHolder != null && _showSelected)
{
viewHolder.ImageSelectedCheckBox.Checked = photoItemModel.Selected;
((ApplicationGlobal)_context.ApplicationContext).PhotoItemsModel = _photoItems;
}
}
}
public class PhotoItemViewHolder : RecyclerView.ViewHolder
{
private readonly IList<PhotoItemModel> _items;
public ImageView ImageView { get; set; }
public CheckBox ImageSelectedCheckBox { get; set; }
public TextView ImageDescriptionTextView { get; set; }
public PhotoItemViewHolder(View view, Action<int> listener, IList<PhotoItemModel> items, bool showSelected) : base(view)
{
_items = items;
ImageDescriptionTextView = (TextView)view.FindViewById(Resource.Id.textViewRecyclerViewTemplateImageDescription);
ImageView = view.FindViewById<ImageView>(Resource.Id.imageViewRecyclerViewTemplateImage);
ImageSelectedCheckBox = view.FindViewById<CheckBox>(Resource.Id.checkBoxRecyclerViewTemplateSelected);
ImageSelectedCheckBox.Visibility = !showSelected ? ViewStates.Invisible : ViewStates.Visible;
view.Click += (sender, args) => listener(AdapterPosition);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment