• 我指的是vogella-tutorial以进行数据绑定(bind)
  • 我正在尝试做的:使用dataBinding
  • 在每个项目的回收器 View 行中检测onClick的最佳方法是什么?

    activity_second.xml
    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
    
        <data>
            <variable
                name="temp"
                type="com.vogella.android.databinding.TemperatureData" />
            <variable
                name="presenter"
                type="com.vogella.android.databinding.MainActivityPresenter"/>
        </data>
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/my_recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical" />
    </layout>
    

    rowlayout.xml
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
    
        <data>
    
            <variable
                name="obj"
                type="com.vogella.android.databinding.TemperatureData"
                />
        </data>
    
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="?android:attr/listPreferredItemHeight"
            android:padding="6dip"
            >
    
            <ImageView
                android:id="@+id/icon"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_alignParentBottom="true"
                android:layout_alignParentTop="true"
                android:layout_marginRight="6dip"
                android:contentDescription="TODO"
                android:src="@drawable/ic_listentry"
                />
    
            <TextView
                android:id="@+id/secondLine"
                android:layout_width="fill_parent"
                android:layout_height="26dip"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true"
                android:layout_toRightOf="@id/icon"
                android:ellipsize="marquee"
                android:text="@{obj.location}"
                android:textSize="12sp"
                android:maxLines="1"
            />
    
            <TextView
                android:id="@+id/firstLine"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_above="@id/secondLine"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:layout_alignWithParentIfMissing="true"
                android:layout_toRightOf="@id/icon"
                android:gravity="center_vertical"
                android:text="@{obj.celsius}"
                android:textSize="16sp"
                />
    
        </RelativeLayout>
    
    </layout>
    

    MyAdapter.java
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
            private List<TemperatureData> data;
    
            // Provide a reference to the views for each data item
            // Complex data items may need more than one view per item, and
            // you provide access to all the views for a data item in a view holder
            public class MyViewHolder extends RecyclerView.ViewHolder {
                    // each data item is just a string in this case
                    private final ViewDataBinding binding;
    
                    public MyViewHolder(ViewDataBinding binding) {
                            super(binding.getRoot());
                            this.binding = binding;
                    }
                    public void bind(Object obj) {
                           binding.setVariable(BR.obj,obj);
                           binding.executePendingBindings();
                    }
            }
    
            // Provide a suitable constructor (depends on the kind of dataset)
            public MyAdapter(List<TemperatureData> myDataset) {
                    data = myDataset;
            }
    
            // Create new views (invoked by the layout manager)
            @Override
            public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                    // create a new view
                    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
                    ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.rowlayout, parent, false);
                    // set the view's size, margins, paddings and layout parameters
                    return new MyViewHolder(binding);
            }
    
            // Replace the contents of a view (invoked by the layout manager)
            @Override
            public void onBindViewHolder(MyViewHolder holder, int position) {
                    final TemperatureData temperatureData = data.get(position);
                    holder.bind(temperatureData);
    
            }
    
            // Return the size of your dataset (invoked by the layout manager)
            @Override
            public int getItemCount() {
                return data.size();
            }
    
    }
    

    MyAdapter.java
    public class MyAdapter extends MyBaseAdapter {
    
        List<TemperatureData> data;
    
        // Provide a suitable constructor (depends on the kind of dataset)
        public MyAdapter(List<TemperatureData> myDataset) {
            data = myDataset;
        }
        @Override
        public Object getDataAtPosition(int position) {
            return data.get(position);
        }
    
        @Override
        public int getLayoutIdForType(int viewType) {
            return R.layout.rowlayout;
        }
    
        @Override
        public int getItemCount() {
            return data.size();
        }
    }
    

    最佳答案

    不知道您是否已经找到解决方案,但是我设法很容易地做到了。

    1)修改onCreateViewHolder方法看起来像这样:

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.rowlayout, parent, false);
    
        MainActivityPresenter presenter = new MainActivityPresenter(this, parent.getContext());
        binding.setVariable(BR.presenter,presenter);
    
        // set the view's size, margins, paddings and layout parameters
        return new MyViewHolder(binding);
    }
    

    2)使MyAdapter实现MainActivityContract.View,所以最终看起来像下面这样:
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements MainActivityContract.View
    3)在MyAdapter中实现必要的方法;例如:
    @Override
    public void showData(TemperatureData data) {
        String clickedItemCelsius = data.getCelsius();
    }
    

    4)将Presenter变量添加到您的行布局文件中:
        <variable
            name="presenter"
            type="com.mvvm.ViewModels.MainActivityPresenter"/>
    

    5)最后,将您的onClick事件卡在RelativeLayout下:
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="?android:attr/listPreferredItemHeight"
        android:padding="6dip"
        android:onClick="@{() -> presenter.onShowData(obj)}"
        >
    

    希望能帮助到你!

    关于android - 在Android中使用数据绑定(bind)在Recycler View 中检测onClick,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45723115/

    10-08 23:27