Как быть перенаправленным на другой вид деятельности при нажатии на ViewHolder, который содержит RecyclerView? - PullRequest
0 голосов
/ 28 марта 2019

Я использую RecyclerView для отображения некоторых данных. Для каждого элемента у меня есть собственный макет, который содержит некоторые текстовые представления RecyclerView:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:layout_width="180dp"
        android:layout_height="45dp"
        android:id="@+id/recycler_view"/>

    //Other text views
</RelativeLayout>

Это мой класс адаптера:

class UserViewHolder extends RecyclerView.ViewHolder {
    View itemView;
    RecyclerView recyclerView;

    UserViewHolder(View itemView) {
        super(itemView);
        this.itemView = itemView;
        recyclerView = itemView.findViewById(R.id.recycler_view);
    }

    void bind(User user) {
        itemView.setOnClickListener(view -> {
            //Move to user Activity
        });

        UserAdapter adapter = new UserAdapter(user.list);
        recyclerView.setAdapter(adapter);

        itemView.bringToFront(); //Doesn't work!!!
    }
}

Я установил прослушиватель кликов для всего itemView, чтобы я мог быть перенаправлен на действия пользователя. Проблема в том, что когда я нажимаю на элементы, которые существуют в RecyclerView, я не перенаправлен. Я пытался вывести itemView перед RecyclerView, но безуспешно. Как мне сделать так, чтобы меня могли перенаправить на активность пользователя, даже если я нажму на RecyclerView? Спасибо!

Edit:

Вот так выглядит мой макет itemView:

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:clickable="true">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        //One TextView
        //One ImageView
        //One RecyclerView
    </RelativeLayout>
</android.support.v7.widget.CardView>

Это изображение этого:

enter image description here

Ответы [ 3 ]

2 голосов
/ 29 марта 2019

Из того, что я понимаю, вы хотите перенаправить пользователя, щелкнув по строке / элементу утилизатора.Тогда вам нужно сделать родительский макет itemView кликабельным и фокусируемым.Вы не предоставили макет xml для itemView, но я постараюсь объяснить.Ваш itemView - это отдельный файл макета xml, содержащий изображения и текстовые поля, все они добавляются в родительский макет Linear / Constraint / Relative Layout.Этот родительский макет должен иметь clickable = true и focusable = true, чтобы принимать события кликов.

Проблема, как мы установили, заключается в том, что вложенный переработчик потребляет событие click.Если ожидается, что вложенный переработчик не будет прокручиваться, способ заблокировать это событие - добавить setLayoutFrozen(true) во вложенный переработчик.Учебное пособие ссылка и документы

2 голосов
/ 28 марта 2019

Простой, вместо того, чтобы пытаться перемещаться по этому новому экрану из адаптера, вы можете реализовать интерфейс и использовать его из действия / фрагмента, в котором RecyclerView виден ..

Демонстрация

class UserViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    View itemView;
    RecyclerView recyclerView;

    UserViewHolder(View itemView) {
        super(itemView);
        this.itemView = itemView;
        recyclerView = itemView.findViewById(R.id.recycler_view);
    }

    @Override
    public void onClick(View v) {
        if (listener != null)
           listener.onItemListClicked(getAdapterPosition());
    }

    void bind(User user) {
        itemView.setOnClickListener(this);

        UserAdapter adapter = new UserAdapter(user.list);
        recyclerView.setAdapter(adapter);

        itemView.bringToFront(); //Doesn't work!!!
    }
}

Интерфейс должен быть размещен вне класса UserViewHolder.

public interface MyClickListener{
    void onItemListClicked(int position);
}

У вас будет открытый метод в адаптере, который установит слушателя

public void setListenerForAdapter(MyClickListener listener) {
    this.listener = listener;
}

Наконец-то в своей деятельности вы настроите слушателя на адаптер

adapter.setListener(/*here you will implement your custom listener and start a new activity / fragment based on which position was clicked*/);

По любым другим вопросам не стесняйтесь задавать.Удачного кодирования!

0 голосов
/ 28 марта 2019

Если это статическая активность и она не изменится со временем, вы можете сделать что-то подобное, в противном случае используйте интерфейс.

class UserViewHolder extends RecyclerView.ViewHolder {
View itemView;
RecyclerView recyclerView;

UserViewHolder(View itemView) {
    super(itemView);
    this.itemView = itemView;
    recyclerView = itemView.findViewById(R.id.recycler_view);
}

void bind(User user) {
    itemView.setOnClickListener(view -> {
        view?.context?.startActivity(Intent(view?.context, YourDestinationActivity::class.java))
    // this is kotlin code just parse it to java 
    });

    UserAdapter adapter = new UserAdapter(user.list);
    recyclerView.setAdapter(adapter);

    itemView.bringToFront(); //Doesn't work!!!
}
...