Recycler-просмотр привязки данных по щелчку строки - PullRequest
2 голосов
/ 24 июня 2019

Что я делаю : я отобразил представление списка, используя привязку данных

Что я пытаюсь найти : Как правильно добавить событие при нажатиии отобразите тост как имя студента

Student.java

public class Student {

    private  String name;
    private  String email;

    public Student() {
    }

    public Student(String name, String email) {
        this.name = name;
        this.email = email;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }


}

ActDemoListView.java

public class ActDemoListView extends AppCompatActivity {


    private ActDemoListViewViewModel actDemoListViewViewModel;
    private ActDemoListViewBinding actDemoListViewBinding;


    private RecyclerView recyclerView;
    private AdptStudent adptStudent;
    private List<Student> studentList = new ArrayList<>();

    /************************************* Life Cycle Methods *************************************/
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initOnCreate();
    }
    /************************************* Life Cycle Methods *************************************/

    /************************************* Init Methods *******************************************/
    /** Init OnCreate **/
    private void initOnCreate() {
        setContentView(R.layout.act_two_way_display_data);
        //Connect the view model to activity
        connectViewModel();
        //Bind the layout to activity
        bindLayoutToActivity();

        recyclerView = actDemoListViewBinding.recyclerList;
        adptStudent = new AdptStudent(studentList);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adptStudent);

        prepareMovieData();
    }



    /************************************* Init Methods *******************************************/


    private void connectViewModel() {
        actDemoListViewViewModel = ViewModelProviders.of(this).get(ActDemoListViewViewModel.class);
    }

    private void bindLayoutToActivity() {
        actDemoListViewBinding = DataBindingUtil.setContentView(this,R.layout.act_demo_list_view);
    }

    private void prepareMovieData() {
        Student movie = new Student("Shruthi", "user11@google.com");
        studentList.add(movie);

        movie = new Student("Shalvi", "user1@google.com");
        studentList.add(movie);

        movie = new Student("Pavan", "user2@google.com");
        studentList.add(movie);

        movie = new Student("Brijesh", "user3@google.com");
        studentList.add(movie);

        movie = new Student("Anudeep", "user4@google.com");
        studentList.add(movie);

        adptStudent.notifyDataSetChanged();
    }

}

AdptStudent.java

public class AdptStudent extends RecyclerView.Adapter<AdptStudent.MyViewHolder> {


    private List<Student> studentsList = new ArrayList<>();


    public AdptStudent(List<Student> studentsList) {
        this.studentsList = studentsList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ListItemBinding listItemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),R.layout.list_item, parent, false);
        return new MyViewHolder(listItemBinding);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Student student = studentsList.get(position);
        holder.listItemBinding.setStudent(student);
    }

    @Override
    public int getItemCount() {
        return studentsList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

        private ListItemBinding listItemBinding;

        public MyViewHolder(ListItemBinding ListItemBinding) {
            super(ListItemBinding.getRoot());
            this.listItemBinding=ListItemBinding;
        }
    }


}

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Есть несколько способов сделать это. Когда я хочу, чтобы элемент в представлении переработчика был кликабельным, я делаю это.

Сначала я создаю интерфейс

public interface ItemClickListener {
    void onClick(View view, int position, boolean click);
}

Во-вторых, в класс держателя вида я добавляю эти методы

    @Override
    public void onClick(View view) {
        itemClickListener.onClick(view, getAdapterPosition(), false);
    }

    public void setItemClickListener(ItemClickListener itemClickListener) {
        this.itemClickListener = itemClickListener;
    }

И, наконец, на onBindViewHolder

@Override
public void onBindViewHolder(@NonNull final CategoryAdapter.MyViewHolder myViewHolder, int i) {

    myViewHolder.setItemClickListener(new ItemClickListener() {
        @Override
        public void onClick(View view, int position, boolean click) {
            Intent intent = new Intent(myViewHolder.context, Myclass.class);
            myViewHolder.context.startActivity(intent);
        }
    });
}

Если вы хотите, чтобы я предоставил весь код для адаптера, просто спросите.

0 голосов
/ 24 июня 2019

Я использовал следующий подход.Обратите внимание, что ваш «Элемент» может быть вашей моделью представления, если вам нравится, к которому у вас есть доступ внутри привязанного макета для каждого элемента.И оттуда вы можете вызывать любой метод, который вы хотите внутри vm, или установить LiveData или что угодно, чтобы сообщить представлению отображать тост.Для этой цели я рекомендую использовать SingleLiveEvent .

Сначала я создал BaseAdapter.

public class BaseAdapter<T> extends ListAdapter<T, SingleItemViewHolder<T>> {

private final int variableId;

protected BaseAdapter(@NonNull DiffUtil.ItemCallback<T> diffCallback, int variableId) {
    super(diffCallback);
    this.variableId = variableId;
}

@NonNull
@Override
public SingleItemViewHolder<T> onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    ViewDataBinding binding = DataBindingUtil.inflate(
            LayoutInflater.from(parent.getContext()), viewType, parent, false);

    return new SingleItemViewHolder<>(binding, variableId);
}

@Override
public void onBindViewHolder(@NonNull SingleItemViewHolder<T> holder, int position) {
    holder.bind(getItem(position));
}

}

Этот адаптер использует следующий SingleItemViewHolder.

public final class SingleItemViewHolder<T> extends RecyclerView.ViewHolder {

private final ViewDataBinding binding;

private final int variableId;

/**
 * Constructor
 *
 * @param binding the binding to use
 * @param variableId variable to set on the binding
 */
public SingleItemViewHolder(ViewDataBinding binding, int variableId) {
    super(binding.getRoot());
    this.binding = Objects.requireNonNull(binding);
    this.variableId = variableId;
}

/**
 * Sets the data binding variable to the provided item
 * and calls {@link ViewDataBinding#executePendingBindings()}.
 *
 * @param item item to bind
 * @throws NullPointerException if item is null ({@code item == null})
 */
public void bind(@NonNull T item) {
    Objects.requireNonNull(item);
    binding.setVariable(variableId, item);
    binding.executePendingBindings();
}
}

Затем вы используете его, создав подкласс BaseAdapter и предоставив свой собственный DiffCallback и макет, подобный этому.

public final class ModelAdapter extends BaseAdapter<Model> {

public ModelAdapter() {
    super(new DiffCallback(), BR.item);
}

@Override
public int getItemViewType(int position) {
    return R.layout.item_model;
}

private static final class DiffCallback extends DiffUtil.ItemCallback<Model> {

    @Override
    public boolean areItemsTheSame(@NonNull Model oldItem, @NonNull Model newItem) {
        return oldItem.id.equals(newItem.id);
    }

    @Override
    public boolean areContentsTheSame(@NonNull Model oldItem, @NonNull Model newItem) {
        return oldItem.equals(newItem);
    }
}
}

Где Model - это простой объектный класс Java с некоторыми полями (не включены)для краткости).

Тогда раскладка, которая показывает фактическую модель и допускает привязку данных.

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="item"
            type="com.example.models.Model" />
    </data>

    ....

Затем вы можете просто использовать этот элемент внутри раскладки.

Пример использования бонуса

Затем создайте его экземпляр так, как вы хотите.Моя рекомендация, как я это сделал, состояла в том, чтобы создать экземпляр в представлении (фрагмент) присоединить его, используя привязку данных.

<data>
    <variable
        name="adapter"
        type="com.example.ModelAdapter" />
</data>

....

<androidx.recyclerview.widget.RecyclerView
            recycler_view_base_adapter_items="@{vm.models}"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:adapter="@{adapter}"
            android:orientation="vertical"
            android:scrollbars="vertical"             
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

С помощью следующего @ BindingAdapter.

@BindingAdapter(value = {"recycler_view_base_adapter_items"})
public static <T> void setRecyclerViewBaseAdapterItems(RecyclerView view,
                                                       @Nullable final List<T> items) {

    final RecyclerView.Adapter viewAdapter = view.getAdapter();

    if (viewAdapter == null || items == null) {
        Timber.w("recycler_view_base_adapter_items did nothing.");
        return;
    }

    try {
        @SuppressWarnings("unchecked") final BaseAdapter<T> adapter = (BaseAdapter<T>) viewAdapter;
        adapter.submitList(items);

    } catch (ClassCastException e) {
        Timber.e(e);
    }
}
...