java - 具有数据绑定(bind)的 Recyclerview 无法检测 onClick 操作

标签 java android mvvm data-binding android-recyclerview

我正在开发一个小项目,在该项目中我试图通过数据绑定(bind)来实现 MVVM 到已存在的应用程序,但我陷入了 onClick 事件。基本上,我尝试在 ViewModel 中调用的方法突出显示为黄色,因此绑定(bind)已就位(即 "onCLickS" 方法)。我放置在 ViewModel 中以检查绑定(bind)的 @BindingAdapter 也可以正常工作。

我尝试将 android:onClick 基本上放在布局中的任何位置,但没有成功。已经尝试了我能在网上找到的所有内容。

Gradle 中启用了数据绑定(bind)。 recyclerview 的主要 Activity :

public class MainListActivity extends AppCompatActivity {

private MainListAdapter myAdapter;
private MainListViewModel mainListViewModel;
private List<MainListModel> myGridList;
private RecyclerView recyclerView;
private ActivityMainListBinding binding;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main_list);

    binding= DataBindingUtil.setContentView(this, R.layout.activity_main_list);
    mainListViewModel = new MainListViewModel();

    recyclerView = (RecyclerView) findViewById(R.id.myRecView);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    myGridList = mainListViewModel.passGridList();

    myAdapter = new MainListAdapter(myGridList);
    recyclerView.setAdapter(myAdapter);
    binding.setViewModel(mainListViewModel);
    binding.setAdapter(myAdapter);

    }
}

我的行项目的 Activity :

public class MainListItemActivity extends AppCompatActivity {

private MainListViewModel mainListViewModel;
private MainListItemBinding binding;

@Override
protected void onCreate (Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main_list);

    binding= DataBindingUtil.setContentView(this, R.layout.main_list_item);
    mainListViewModel = new MainListViewModel();

    binding.setViewModel(mainListViewModel);


    }
}

View 模型:

public class MainListViewModel extends BaseObservable{

    private final ObservableField<String> text;
//    private final Context context;
    public ObservableArrayList<MainListModel> gridList;
    iMainListItems iMainListItems;


    private static final String TAG = "MainListViewModel";

    public MainListViewModel(){

        text = new ObservableField<String>();
        gridList = new ObservableArrayList<MainListModel>();
//        this.context = context;
        this.iMainListItems = iMainListItems;

    }

    @BindingAdapter({"android:newActivity"})
    public static void lounchNewActivity(View view, String category) {
        Intent intent = new Intent(view.getContext(), LinkListActivity.class);
        intent.putExtra("category",category);
        view.getContext().startActivity(intent);
    }
    public List<MainListModel> passGridList(){

        gridList.add(new MainListModel(R.drawable.books, "Books"));
        gridList.add(new MainListModel(R.drawable.business,  "Business"));
        gridList.add(new MainListModel(R.drawable.cinema, "Cinema"));
        gridList.add(new MainListModel(R.drawable.politics,  "Politics"));
        gridList.add(new MainListModel(R.drawable.technology,  "Technology"));
        gridList.add(new MainListModel(R.drawable.gaming,  "Gaming"));
        gridList.add(new MainListModel(R.drawable.cooking,  "Cooking"));
        gridList.add(new MainListModel(R.drawable.datascience,  "Data Science"));
        gridList.add(new MainListModel(R.drawable.design,  "Design"));
        gridList.add(new MainListModel(R.drawable.diy,  "DIY"));
        gridList.add(new MainListModel(R.drawable.sports,  "Sports"));

        notifyPropertyChanged(BR.model);

        return gridList;

    }

    public  void onClickL(){

        Log.e(TAG,"Long Clicked!!!!!!!!!!!1");

    }

    public  void onClickS(View view,String category){


        Intent intent = new Intent(view.getContext(), LinkListActivity.class);
        intent.putExtra("category",category);
        view.getContext().startActivity(intent);

        Log.d(TAG,"Clicked!!!!!!");

    }

}

行项目布局:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <import type="android.view.View" />
        <variable
            name= "model"
            type = "com.example.psotor.zbiq.models.MainListModel"/>
        <variable
            name= "viewModel"
            type = "com.example.psotor.zbiq.viewmodels.MainListViewModel"/>
    </data>
            <android.support.v7.widget.CardView
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="200dp"
                android:paddingTop="26dp"
                android:paddingLeft="16dp"
                android:paddingRight="16dp"
                android:paddingBottom="2dp"

                >
                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                   >
                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:textColor="#ffffff"
                        android:background="@color/colorPrimaryFade"
                        android:layout_alignParentBottom="true"
                        android:textSize="24sp"
                        android:textAlignment="center"
                        android:elevation="2dp"
                        android:text="@{model.categoryName}"
                        android:id="@+id/gridName"

                        />
                    <ImageView
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:id="@+id/gridImage"
                        android:scaleType="centerCrop"
                        android:background="@color/colorPrimary"
                        android:src="@{model.categoryImage}"
                        android:onClick="@{(v) -> viewModel.onClickS(v,model.categoryName)}"
                        android:clickable="true"
                        android:focusable="true"
                    />
                </RelativeLayout>
    </android.support.v7.widget.CardView>
</layout>

适配器:

public class MainListAdapter extends RecyclerView.Adapter<MainListViewHolder> {


    private List<MainListModel> gridList;


    public MainListAdapter(List<MainListModel> gridList) {
        this.gridList = gridList;
    }

    @Override
    public MainListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        MainListItemBinding binding = MainListItemBinding.inflate(inflater,parent,false);
        return new MainListViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(MainListViewHolder holder,int position) {

        final MainListModel mainListModel = gridList.get(position);
        holder.bind(mainListModel);
    }

    @Override
    public int getItemCount() {

        return (null != gridList ? gridList.size() : 0);
    }
    @BindingAdapter({"android:src"})
    public static void setImageViewResource(ImageView imageView, int resource) {
        Picasso.with(imageView.getContext())
                .load(resource)
                .centerCrop()
                .resize(500,500)
                .into(imageView);
    }

}

ViewHolder:

public class MainListViewHolder extends RecyclerView.ViewHolder  {

    private final MainListItemBinding mBinding;

    public MainListViewHolder(MainListItemBinding binding) {
        super(binding.getRoot());
        this.mBinding = binding;

    }
    public void bind (MainListModel mainListModel){
        mBinding.setModel(mainListModel);
        mBinding.executePendingBindings();
    }
}

最佳答案

调试数据绑定(bind)。

  • 在 Android Studio 中启用数据绑定(bind)调试
    • 打开“设置”>“编辑器”>“数据绑定(bind)”>“编译器生成的引用代码
  • 构建项目。
  • 打开布局的数据绑定(bind)文件(应类似于 MainListItemBinding)
  • 找到 onClickS 方法调用
  • 在该处及其所在方法的顶部放置一个断点(例如 _internalCallbackOnClick
  • 调试应用并等待到达顶部断点,然后单步执行到应调用方法的位置。

如果您仍然无法弄清楚,请发布此调试的结果。

关于java - 具有数据绑定(bind)的 Recyclerview 无法检测 onClick 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47113664/

相关文章:

java - Android MQTT 客户端订阅在 API 级别 26 下无法工作

java - Java 中不必要的拆箱 - 如何重构代码?

java - 为什么我在 Android 中需要 super() ?

c# - 在 WPF/MVVM 中动态添加用户控件

mvvm - 使用 MVVM 和 Caliburn.Micro 显示 MessageDialog

java - 将传入的 JSON 映射到 Spring Boot 中的类

java - 准备好的语句参数索引超出范围(0 < 1)

android - 如果我在 Qt 中为 Android 和 iOS 构建游戏,我可以像游戏中心一样在其中包含 Objective-C 工具包吗?

Android 可以将共享首选项用于登录目的

c# - 带有 WCF 服务列表的数据绑定(bind)组合框