我必须复制以下RecyclerView
:
RecyclerView
包含Schedule
对象的列表。当我单击星星时,我想更改其颜色。当我单击文本时,我要打开新的Activity
,其中包含有关Schedule
的更多详细信息。
在我的活动中,我希望使用以下方法:
//method which gets executed when I click on a star
OnStarClick()
{
//Get Schedule id
//Get reference of the star so I can change its color
}
//method which gets executed when I click on a text
OnTextClicked()
{
//Get Schedule id
}
这是我的活动:
public class SchedulesActivity : BaseActivity
{
RecyclerView schedulesRecyclerView;
RecyclerView.LayoutManager schedulesLayoutManager;
SchedulesAdapter schedulesAdapter;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.SchedulesActivity);
List<Schedule> schedules = //Get it from database
schedulesRecyclerView = FindViewById<RecyclerView>(Resource.Id.schedulesRecyclerView);
schedulesLayoutManager = new LinearLayoutManager(this);
schedulesRecyclerView.SetLayoutManager(schedulesLayoutManager);
schedulesAdapter = new SchedulesAdapter(schedules);
schedulesRecyclerView.SetAdapter(schedulesAdapter);
}
OnStarClicked()
{
}
OnTextClicked()
{
}
}
这里是Schedule
模型:
public class Schedule
{
public int Id { get; set; }
public string Day { get; set; }
public string Hour { get; set; }
public string ShortDescription { get; set; }
public string LongDescription { get; set; }
}
这里是我的ViewHolder
:
public class ScheduleViewHolder : RecyclerView.ViewHolder
{
public ImageView starImageView { get; private set; }
public TextView hourAndScheduleTextView { get; private set; }
// Get references to the views defined in the CardView layout.
public ScheduleViewHolder(View itemView)
: base(itemView)
{
// Locate and cache view references:
starImageView = itemView.FindViewById<ImageView>(Resource.Id.starImageView);
hourAndScheduleTextView = itemView.FindViewById<TextView>(Resource.Id.hourAndScheduleTextView);
}
}
这是我的适配器:
public class SchedulesAdapter : RecyclerView.Adapter
{
public List<Schedule> listOfSchedules;
public SchedulesAdapter(List<Schedule> schedules)
{
listOfSchedules = schedules;
}
public override int ItemCount
{
get { return listOfSchedules.Count; }
}
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
ScheduleViewHolder vh = holder as ScheduleViewHolder;
vh.hourAndScheduleTextView.Text = /*listOfSchedules[position].Hour + " " + */listOfSchedules[position].ShortDescription;
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
View itemView = LayoutInflater.From(parent.Context).
Inflate(Resource.Layout.ScheduleCardView, parent, false);
ScheduleViewHolder vh = new ScheduleViewHolder(itemView);
return vh;
}
}
首先,您需要在Schedule类中添加属性以标记此计划是否已加星标。说:
public bool starred { get; set; }
第二,您可以在Adapter的OnBindViewHolder方法中添加单击侦听器(需要先取消预订,以避免创建多个EventHandlers:)>]
vh.starImageView.Click -= Image_Click; vh.hourAndScheduleTextView.Click -= Text_Click; vh.starImageView.Click += Image_Click; vh.hourAndScheduleTextView.Click += Text_Click;
请确保您的应用程序将根据时间表的已加星标属性显示不同的星级,然后在click方法中找到被点击的时间表并处理click事件:
private void Image_Click(object sender, EventArgs e) { int position = this.recyclerView.GetChildAdapterPosition((View)sender); Schedule sch = listOfSchedules[position]; ... } private void Text_Click(object sender, EventArgs e) { ... }
ps,上面代码中使用的recyclerView与构造函数一起传递。
希望有帮助。