我正在开发一个小项目,在该项目中我试图通过数据绑定(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/