Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Android 练手之旅——RecyclerView(一)Hello #12

Open
soapgu opened this issue Mar 12, 2021 · 0 comments
Open

Android 练手之旅——RecyclerView(一)Hello #12

soapgu opened this issue Mar 12, 2021 · 0 comments
Labels
Demo Demo 安卓 安卓

Comments

@soapgu
Copy link
Owner

soapgu commented Mar 12, 2021

引言

RecyclerView是我学习的第一个复杂的安卓ViewGroup(容器)。
前面我学习的的View或者ViewGroup更加倾向于单一功能或者基本功能。而RecyclerView的地位WPF中的ListBox有接近,具有把控件二维展开的功能,一下子打开了UI和数据层的空间。同时具有一定虚拟化的特性(元素控件可,循环利用,控件层更少内存的开销损耗)。所以说RecyclerView是安卓学习以来第一个让我觉得激动的控件。

RecyclerView内容介绍

RecyclerView有三大最重要元素

  1. LayoutManager
    顾名思义,布局管理就是控制RecyclerView的布局模式的,一共三种,
    LinearLayoutManager:线性布局一维列表
    GridLayoutManager:表格布局,元素二维展开。或者横向对齐或者竖向对齐
    StaggeredGridLayoutManager:错列的表格,不追求对齐而追求布局的“填满”

  2. RecyclerView.Adapter<>

Adapter是RecyclerView绝对的灵魂类,非常重要。但是在WPF中实在又找不到对应对象。
该类为泛型,类型参数为ViewHold。
适配器有三大方法
onCreateViewHolder:告诉我怎么我生产ViewHolder(后面详细说)
onBindViewHolder:告诉我怎么把ViewHolder和第N个数据结合
getItemCount:告诉我数据有多少

  1. ViewHolder
    ViewHolder就是每一个Item的容器对象

原始的用法

新建一个CustomAdapter类继承Adapter,放一个最简单的String数组作为内部数据存储

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
    private String[] mDataSet;

    public CustomAdapter(String[] dataSet) {
        mDataSet = dataSet;
    }

ViewHolder的实现

 public static class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }

没营养的实现的躯壳

Adapter三大方法Override

@NonNull
   @Override
   public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       // Create a new view, which defines the UI of the list item
       LayoutInflater inflater = LayoutInflater.from(parent.getContext());
               //.inflate(R.layout.text_row_item, parent, false);
       TextRowItemBinding binding  = DataBindingUtil.inflate(inflater,R.layout.text_row_item,parent, false );
       return new ViewHolder(binding.getRoot());
   }

   @Override
   public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
       TextRowItemBinding binding = DataBindingUtil.getBinding(holder.itemView);
       binding.setContent(  this.mDataSet[position] );
       binding.executePendingBindings();
   }

   @Override
   public int getItemCount() {
       return this.mDataSet.length;
   }

其中inflater,R.layout.text_row_item是Item的布局

最后是Activity部分的实现

public class SearchActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivitySearchBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_search);
        binding.dataList.setLayoutManager( new LinearLayoutManager( this ) );
        CustomAdapter adapter = new CustomAdapter( new String[]{"A","B","C","E","F"} );
        binding.dataList.setAdapter( adapter );
    }
}

总结部分

一开始看完RecyclerView,是出乎我的预期的

  • Adapter完成大部分的数据描述组装工作,大部分的装配工作是code完成的。而不是View层完成
  • 目前写法不得不在UI Control层(Activity)完成RecyclerView与Adapter和LayoutManager的组装
  • MVVM架构拓展的困难, Adapter既不属于View层也不属于ViewModel层,位置无从安放
  • List集合位置放到Adapter的内部极度奇怪,List集合明显应该放置到ViewModel才对,但是又怎么和Adapter产生联系那
  • 和WPF对标起来就显得及其弱势。没有DataSource可以直接绑定,也没有ItemTemplate可以直接在View层之间定义呈现的表达

相关问题一度困扰着我。
关于后面的进展,请看我的Android 练手之旅——RecyclerView(二)

recyclerview官网

@soapgu soapgu added Demo Demo 安卓 安卓 labels Mar 15, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Demo Demo 安卓 安卓
Projects
None yet
Development

No branches or pull requests

1 participant