【问题标题】:How to use Android View Binding with RecyclerView如何通过 RecyclerView 使用 Android 视图绑定
【发布时间】:2020-06-04 09:52:55
【问题描述】:

这不是数据绑定,这是 Android Studio 3.6 Canary 11+ 中的新视图绑定,描述为here

对于在 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如何使用View Binding?

编辑:请用Java解释。

【问题讨论】:

    标签: java android xml view binding


    【解决方案1】:

    假设我们在 activity_main.xml 中有一个 RecyclerView,它的 id 是 "@+id/rv_test"

    在 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);
        }
    }
    

    让我们将 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();
            }
        }
    
    }
    

    【讨论】:

    • 在您的代码中, binding = ActivityMainBinding.inflate(getLayoutInflater());我不能添加 getLayoutInflator() 作为参数。它向我显示了一个错误。应该是,binding = ActivityMainBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
    • @Yash 此代码假定您在 Activity 中实现 AdaptergetLayoutInflater() 来自 Activity 类。如果您的适配器不在上下文中,那么您需要为LayoutInflater.from 提供源上下文。
    • 或者使用parent.context.getLayoutInflater()?
    • LayoutInflator layoutInflator = LayoutInflator.from(parent.getContext());
    【解决方案2】:
    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()
            }
        }
    
    }
    }
    

    只需将模型或数组列表传递给适配器并在绑定视图中设置

    【讨论】:

      【解决方案3】:

      这是使用视图绑定的完整适配器代码,您可以这样做。

      package com.jbws.myviewbindingdemo.adapter;
      
      import android.view.LayoutInflater;
      import android.view.View;
      import android.view.ViewGroup;
      
      import androidx.annotation.NonNull;
      import androidx.recyclerview.widget.RecyclerView;
      
      import com.jbws.myviewbindingdemo.databinding.RowXmlViewBinding;
      import com.jbws.myviewbindingdemo.pojo.ModelObject;
      
      import java.util.ArrayList;
      
      public class RecyclerViewListAdapter extends RecyclerView.Adapter<RecyclerViewListAdapter.ViewHolder> {
          public ArrayList<ModelObject> modelObjectArrayList;
      
          public RecyclerViewListAdapter(ArrayList<ModelObject> modelObjectArrayList) {
              this.modelObjectArrayList = modelObjectArrayList;
          }
      
          @NonNull
          @Override
          public RecyclerViewListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
              return new ViewHolder(RowXmlViewBinding.inflate(LayoutInflater.from(parent.getContext()),
                      parent, false));
          }
      
          @Override
          public void onBindViewHolder(@NonNull RecyclerViewListAdapter.ViewHolder holder, final int position) {
              ModelObject modelObject = modelObjectArrayList.get(position);
              holder.rowXmlViewBinding.txtObjectName.setText(modelObject.getFullName());
              holder.rowXmlViewBinding.btnUpdateName.setOnClickListener(view -> {
               Log.i("LOG_TAG", "Full Name: " + modelObject.getFullName);
              });
          }
      
          @Override
          public int getItemCount() {
              return modelObjectArrayList == null ? 0 :
                      modelObjectArrayList.size();
          }
      
          public static class ViewHolder extends RecyclerView.ViewHolder {
              private RowXmlViewBinding rowXmlViewBinding;
      
              public ViewHolder(RowXmlViewBinding rowXmlViewBinding) {
                  super(rowXmlViewBinding.getRoot());
                  this.rowXmlViewBinding = rowXmlViewBinding;
              }
          }
      }
      

      【讨论】:

      • 这个例子onCreateViewHolder 是正确膨胀行的例子 - 接受的答案方式生成空行。
      【解决方案4】:

      这是使用 ViewBinding 的完整适配器代码

      public class JobsAdapter2 extends RecyclerView.Adapter<JobsAdapter2.ViewHolder> {
      
          public ArrayList<JobsList> jobsList;
      
          LayoutTitleItem2Binding binding;
      
          public JobsAdapter2(ArrayList<JobsList> jobsList) {
              this.jobsList = jobsList;
          }
      
          public int getCount() {
              return jobsList.size();
          }
      
          @NonNull
          @Override
          public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
              return new JobsAdapter2.ViewHolder(LayoutTitleItem2Binding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
          }
      
          @Override
          public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
              JobsList dataModel = jobsList.get(position);
              Context context = binding.getRoot().getContext();
              Activity activity = (Activity) context;
      
              binding.date.setText(dataModel.getTime())
      
          }
      
          @Override
          public int getItemCount() {
              return jobsList != null ? jobsList.size() : 0;
          }
      
          public class ViewHolder extends RecyclerView.ViewHolder {
      
              public ViewHolder(LayoutTitleItem2Binding itemView) {
                  super(itemView.getRoot());
                  binding = itemView;
      
              }
          }
      }
      

      【讨论】:

      • 嗨!你能提供一些关于你所做的事情的见解吗?干杯!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      相关资源
      最近更新 更多