如何使两个视图的RecycleView项目(Xamarin.Android)可点击?

问题描述 投票:0回答:1

我必须复制以下RecyclerView

enter image description here

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;
    }
}
android-recyclerview view xamarin.android clickable
1个回答
0
投票

首先,您需要在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与构造函数一起传递。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.