温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android MVVM架构怎么实现RecyclerView列表

发布时间:2021-10-29 19:52:56 阅读:290 作者:iii 栏目:开发技术
Android开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

本篇内容主要讲解“Android MVVM架构怎么实现RecyclerView列表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android MVVM架构怎么实现RecyclerView列表”吧!

    效果图

    Android MVVM架构怎么实现RecyclerView列表

    导入引用

    导入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;
            notifyPropertyChangedBR.mName );
        }
        @Bindable
        public List<InformationgetInformationList() {
            return informationList;
        }
    
        /**
         * @param mSex */
        public void setmSex(String mSex) {
            this.mSex = mSex;
            notifyPropertyChangedBR.mSex );
        }
       /**
        * @param mAge */
        public void setmAge(String mAge) {
            this.mAge = mAge;
            notifyPropertyChangedBR.mAge );
        }
        /**
         * @param informationList */
        public void setInformationList(List<Information> informationList) {
            this.informationList = informationList;
            notifyPropertyChangedBR.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.addnew 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列表”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI

    开发者交流群×