Как сделать два представления кликабельными для элемента RecycleView (Xamarin. Android)? - PullRequest
0 голосов
/ 28 февраля 2020

Мне нужно сделать копию следующего 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;
    }
}

1 Ответ

1 голос
/ 02 марта 2020

Сначала вам нужно добавить свойство в классе Schedule, чтобы пометить, если это расписание помечено звездочкой. Скажем:

public bool starred { get; set; }

Во-вторых, вы можете добавить прослушиватель кликов в методе OnBindViewHolder вашего адаптера (необходимо сначала отписаться, чтобы избежать создания нескольких EventHandlers):

vh.starImageView.Click -= Image_Click;
vh.hourAndScheduleTextView.Click -= Text_Click;
vh.starImageView.Click += Image_Click;
vh.hourAndScheduleTextView.Click += Text_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 передается конструктору.

Надеюсь, это поможет.

...