Android MVVM架构实现RecyclerView列表详解流程

编辑: admin 分类: Android 发布时间: 2021-11-29 来源:互联网
目录
  • 效果图
  • 导入引用
    • 导入Recyclerview依赖
    • 导入dataBinding引用
  • 代码解析
    • 建立实体类
    • 建立RecyclerView子项
    • 适配器
      • 建立适配器
      • 设置子项点击事件
      • adapter全部代码
    • 建立VM层
      • 子项点击事件的使用
      • VM层代码
    • 数据与视图交互

    效果图

    导入引用

    导入Recyclerview依赖

     implementation 'androidx.recyclerview:recyclerview:1.1.0'
    

    导入dataBinding引用

     dataBinding {
                enabled = true
            }
    

    代码解析

    建立实体类

    继承被观察者模式BaseObservable

    @Bindable绑定字段

    刷新数据 notifyPropertyChanged( BR.mName );//BR自动生成

    public class Information extends BaseObservable {
        public String mName;
        public String mSex;
        public String mAge;
        public List<Information> informationList;
        public Information(){
    
        }
        public Information(String mName,String mSex,String mAge){
            this.mName = mName;
            this.mSex = mSex;
            this.mAge = mAge;
        }
        @Bindable
        public String getmAge() {
            return mAge;
        }
        @Bindable
        public String getmName() {
            return mName;
    
        }
        @Bindable
        public String getmSex() {
            return mSex;
        }
        /**
         * @param mName*/
        public void setmName(String mName) {
            this.mName = mName;
            notifyPropertyChanged( BR.mName );
        }
        @Bindable
        public List<Information> getInformationList() {
            return informationList;
        }
    
        /**
         * @param mSex */
        public void setmSex(String mSex) {
            this.mSex = mSex;
            notifyPropertyChanged( BR.mSex );
        }
       /**
        * @param mAge */
        public void setmAge(String mAge) {
            this.mAge = mAge;
            notifyPropertyChanged( BR.mAge );
        }
        /**
         * @param informationList */
        public void setInformationList(List<Information> informationList) {
            this.informationList = informationList;
            notifyPropertyChanged( BR.informationList );
        }
    }
    

    将视图层与数据层绑定

    @{information.mName}

    建立RecyclerView子项

    导入实体类

     <data>
            <variable
                name="information"
                type="com.franzliszt.mvvmrecyclerview.model.Information" />
        </data>
    
    <layout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <data>
            <variable
                name="information"
                type="com.franzliszt.mvvmrecyclerview.model.Information" />
        </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:background="#F5F5F5">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:orientation="horizontal"
            android:layout_marginTop="20dp"
            android:background="@drawable/item_bg_style"
            android:gravity="center"
            android:paddingLeft="20dp">
            <TextView
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:hint="名字"
                android:text="@{information.mName}"/>
            <TextView
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:hint="性别"
                android:text="@{information.mSex}"/>
            <TextView
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:hint="年龄"
                android:text="@{information.mAge}"/>
        </LinearLayout>
    
    </LinearLayout>
    </layout>
    

    适配器

    建立适配器

    引入数据源

    public MyRecyclerView(List<Information> informationList){
            this.informationList = informationList;
        }
    

    插入布局文件

     @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            ViewDataBinding binding = DataBindingUtil.inflate( LayoutInflater.from( parent.getContext()) , R.layout.recyclerview_item,parent,false);
            return new ViewHolder( binding,mOnItemClickListener );
        }
    

    设置数据

     @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            Information information = informationList.get( position );
            holder.binding.setVariable( BR.information,informationList.get( position ));
            holder.binding.executePendingBindings();
        }
    

    自定义ViewHolder类

    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
            ViewDataBinding binding = null;
            OnItemClickListener listener;
            public ViewHolder(@NonNull ViewDataBinding binding,OnItemClickListener listener) {
                super( binding.getRoot() );
                this.listener = listener;
                this.binding = binding;
                binding.getRoot().setOnClickListener( this );
            }
            public ViewDataBinding getBinding(){
                return binding;
            }
    

    设置子项点击事件

    定义接口

    public interface OnItemClickListener {
            void onItemClick(View view, int position);
        }
    

    继承View.OnClickListener点击事件

    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
    

    获取接口实例

    public ViewHolder(@NonNull ViewDataBinding binding,OnItemClickListener listener)
    

    调用接口

     @Override
            public void onClick(View v) {
                if (listener != null){
                    listener.onItemClick( v,getPosition() );
                }
            }
    

    开放接口

    public void setOnItemClickListener(OnItemClickListener listener) {
            this.mOnItemClickListener = listener;
        }
    

    adapter全部代码

    public class MyRecyclerView extends RecyclerView.Adapter<MyRecyclerView.ViewHolder>{
        private List<Information> informationList;
        private OnItemClickListener mOnItemClickListener;
        public MyRecyclerView(List<Information> informationList){
            this.informationList = informationList;
        }
    
        public interface OnItemClickListener {
            void onItemClick(View view, int position);
        }
    
        public void setOnItemClickListener(OnItemClickListener listener) {
            this.mOnItemClickListener = listener;
        }
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            ViewDataBinding binding = DataBindingUtil.inflate( LayoutInflater.from( parent.getContext()) , R.layout.recyclerview_item,parent,false);
            return new ViewHolder( binding,mOnItemClickListener );
        }
    
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            Information information = informationList.get( position );
            holder.binding.setVariable( BR.information,informationList.get( position ));
            holder.binding.executePendingBindings();
        }
    
        @Override
        public int getItemCount() {
            return informationList.size();
        }
    
    
        class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
            ViewDataBinding binding = null;
            OnItemClickListener listener;
            public ViewHolder(@NonNull ViewDataBinding binding,OnItemClickListener listener) {
                super( binding.getRoot() );
                this.listener = listener;
                this.binding = binding;
                binding.getRoot().setOnClickListener( this );
            }
            public ViewDataBinding getBinding(){
                return binding;
            }
    
            @Override
            public void onClick(View v) {
                if (listener != null){
                    listener.onItemClick( v,getPosition() );
                }
            }
        }
    }
    

    建立VM层

    子项点击事件的使用

    实现OnItemClickListener接口

    @Override
        public void InitListener(){
            adapter.setOnItemClickListener( new MyRecyclerView.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {
                    Toast.makeText( context,"位数:"+position,Toast.LENGTH_SHORT ).show();
                }
            } );
        }
    

    VM层代码

    public class ViewModel implements IViewModel{
        public Information information;
        public List<Information> mList = new ArrayList<>(  );
        private RecyclerView recyclerView;
        private Context context;
        private MyRecyclerView adapter;
        public ViewModel(Information information, RecyclerView recyclerView, Context context){
            this.information = information;
            this.recyclerView = recyclerView;
            this.context = context;
            InitRecyclerView();
            InitData();
            InitListener();
        }
        private void InitRecyclerView(){
            recyclerView.setLayoutManager( new LinearLayoutManager( context ) );
            adapter = new MyRecyclerView( mList );
            recyclerView.setAdapter( adapter );
        }
        @Override
        public void InitData() {
            for (int i = 0; i < 10; i++) {
                mList.add( new Information( "张三"+i,"男",i+"" ) );
                Log.d( "TAG",mList.get( i ).mName+"" );
            }
            information.setInformationList( mList );
        }
        @Override
        public void InitListener(){
            adapter.setOnItemClickListener( new MyRecyclerView.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {
                    Toast.makeText( context,"位数:"+position,Toast.LENGTH_SHORT ).show();
                }
            } );
        }
    }
    

    数据与视图交互

    public class MainActivity extends AppCompatActivity {
        private ActivityMainBinding binding;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate( savedInstanceState );
            binding = DataBindingUtil.setContentView( this,R.layout.activity_main );
            binding.setViewmodel( new ViewModel(new Information(  ),binding.myRecyclerView,MainActivity.this) );
        }
    }
    

    到此这篇关于Android MVVM架构实现RecyclerView列表详解流程的文章就介绍到这了,更多相关Android RecyclerView列表内容请搜索海外IDC网以前的文章或继续浏览下面的相关文章希望大家以后多多支持海外IDC网!

    【本文由http://www.nextecloud.cn/hk.html首发,转载请保留出处,谢谢】