这不是数据绑定,这是View绑定,它是here中所述的Android Studio 3.6 Canary 11+的新增功能。
很明显,要在一个Activity中使用它,您只需像这样使用它:
假设我们的布局名为activity_main.xml
然后在代码中,我们可以像这样使用它:
public class MainActivity extends Activity{
ActivityMainBinding binding; //Name of the layout in camel case + "Binding"
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
}
}
但是,尚不清楚如何在RecyclerView中使用视图绑定?
编辑:请用Java解释。
假设我们在activity_main.xml
内部有一个RecyclerView,其ID为"@+id/rv_test"
在活动内部,我们可以像这样使用它:
public class MainActivity extends Activity{
ActivityMainBinding binding; //Name of the layout in camel case + "Binding"
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
binding.rvTest.setLayoutManager(layoutManager);
}
}
让我们命名为RecyclerView项目test_list_item.xml
的布局>
然后,我们可以像这样在Activity中实现适配器:
public class MainActivity extends Activity{
ActivityMainBinding binding; //Name of the layout in camel case + "Binding"
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
binding.rvTest.setLayoutManager(layoutManager);
List<String> items = Arrays.asList("item", "item", "item");
binding.rvTest.setAdapter(new MyAdapter(items));
}
private class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
private List<String> items;
private class MyViewHolder extends RecyclerView.ViewHolder{
TestListItemBinding binding;//Name of the test_list_item.xml in camel case + "Binding"
public MyViewHolder(TestListItemBinding b){
super(b.getRoot());
binding = b;
}
}
public MyAdapter(List<String> items){
this.items = items;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
return new MyViewHolder(TestListItemBinding.inflate(getLayoutInflater()));
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position){
String text = String.format(Locale.ENGLISH, "%s %d", items.get(position), position);
//An example of how to use the bindings
holder.binding.tvTest.setText(text);
}
@Override
public int getItemCount(){
return items.size();
}
}
}
class LanguageAdapter(val context: Context, var listData: MutableList<ListData>, val listener: onCheckListner) : RecyclerView.Adapter<LanguageAdapter.ViewHolder>() {
lateinit var bindind: LangugaeItemBinding
fun onRefresh(listData: MutableList<ListData>) {
this.listData = listData
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
bindind = LangugaeItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(bindind)
}
override fun getItemCount(): Int {
return listData.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.setData(listData[position])
}
inner class ViewHolder(private val binding: LangugaeItemBinding) : RecyclerView.ViewHolder(binding.getRoot()), View.OnClickListener {
override fun onClick(v: View?) {
when (v) {
itemView -> {
}
}
}
init {
itemView.radio_button.setOnClickListener(this)
}
fun setData(model: ListData) {
with(binding) {
data = model
executePendingBindings()
}
}
}
}
MVVM是一种架构模式,旨在简化用户界面编程。 Google似乎鼓励使用MVVM进行数据绑定。实际上,其数据绑定库的体系结构组件是基于MVVM模式建模的。