如何在RecyclerView中使用Android View绑定

问题描述 投票:-1回答:3

这不是数据绑定,这是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解释。

java android
3个回答
1
投票

假设我们在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();
        }
    }

}

0
投票
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()
        }
    }

}
}

0
投票

MVVM是一种架构模式,旨在简化用户界面编程。 Google似乎鼓励使用MVVM进行数据绑定。实际上,其数据绑定库的体系结构组件是基于MVVM模式建模的。

© www.soinside.com 2019 - 2024. All rights reserved.