学习路径:最基础ListView到 MVVM+DataBindi

2019-05-27  本文已影响0人  小熊兜里有糖

第一阶段:基础ListView的使用(包含重用和ViewHolder)

①MainActivity

    public class MainActivity extends AppCompatActivity {
        //用于存放listView资源信息
        ArrayList<Fruit> arrayList = new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ListView listView = findViewById(R.id.list_view);
            Fruit fruit1 = new Fruit("apple","abcde");
            Fruit fruit2 = new Fruit("banana","sadad");
            Fruit fruit3 = new Fruit("orange","fdgdf");
            arrayList.add(fruit1);
            arrayList.add(fruit2);
            arrayList.add(fruit3);
    
         //声明并绑定Adapter和listView
            FruitAdapter adapter = new FruitAdapter(this,R.layout.listview_item,arrayList);
            listView.setAdapter(adapter);
    
         //点击事件
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    Fruit fruit = arrayList.get(i);
                    Toast.makeText(MainActivity.this,fruit.getName()+"被点击了",Toast.LENGTH_SHORT).show();
                }
            });
    
        }
    }

 ②FruitAdapter最重要的类!!!
 
 - ViewHolder的使用结合了viewitem的回收机制,达到减少高消耗的findById的效果
 
 
        public class FruitAdapter extends ArrayAdapter {
    
            private int resourse;
        
            public FruitAdapter(Context context, int resource , List<Fruit> objects) {
                super(context, resource,objects);
                this.resourse = resource;
            }
        
            @Override
            public View getView(int position,  View convertView,ViewGroup parent) {
                Fruit fruit = (Fruit) getItem(position);
                ViewHolder viewHolder;
                if (convertView == null){
                    convertView = LayoutInflater.from(getContext()).inflate(resourse,null);
                    viewHolder = new ViewHolder();
                    viewHolder.text1 = convertView.findViewById(R.id.text1);
                    viewHolder.text2 = convertView.findViewById(R.id.text2);
                    convertView.setTag(viewHolder);
        
                }else {
                     viewHolder = (ViewHolder) convertView.getTag();
                }
        
                viewHolder.text1.setText(fruit.getName());
                viewHolder.text2.setText(fruit.getDiscription());
        
                return convertView;
            }
        
            class ViewHolder{
                TextView text1;
                TextView text2;
            }
        }

Fruit

    public class Fruit {
    
        private String name ;
        private String discription;
    
        public Fruit(String name,String discription){
            this.name = name;
            this.discription = discription;
        }
    
        public String getName() {
            return name;
        }
    
        public String getDiscription() {
            return discription;
        }
    }

第二阶段:listView结合DataBinding的使用

     public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //系统生成的类
            ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
            UserBean bean = new UserBean("张三",25);
            binding.setUser(bean);
            //setContentView(R.layout.activity_main);
        }
    }

第三阶段:RecyclerView的使用

RecyclerView是什么?

从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。RecyclerView的官方定义如下:

    A flexible view for providing a limited window into a large data set.

从定义可以看出,flexible(可扩展性)是RecyclerView的特点。
RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字Recyclerview即回收view也可以看出。

一些简单使用

recyclerView = (RecyclerView) findViewById(R.id.recyclerView);  
LinearLayoutManager layoutManager = new LinearLayoutManager(this );  
//设置布局管理器  
recyclerView.setLayoutManager(layoutManager);  
//设置为垂直布局,这也是默认的  
layoutManager.setOrientation(OrientationHelper. VERTICAL);  
//设置Adapter  
recyclerView.setAdapter(recycleAdapter);  
 //设置分隔线  
recyclerView.addItemDecoration( new DividerGridItemDecoration(this ));  
//设置增加或删除条目的动画  
recyclerView.setItemAnimator( new DefaultItemAnimator());  

简单使用

activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/RecycleView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
           />
    
    </LinearLayout>

item_1.xml

    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

        <TextView
            android:id="@+id/text1"
            android:layout_width="0dp"
            android:layout_height="120dp"
            android:layout_weight="1"
            android:textAlignment="center"
            android:gravity="center"/>
    
        <TextView
            android:id="@+id/text2"
            android:layout_width="0dp"
            android:layout_height="120dp"
            android:layout_weight="1"
            android:textAlignment="center"
            android:gravity="center"/>
    
    </LinearLayout>

其他更详细可以参考博客,我觉得写的挺全的

 https://www.jianshu.com/p/4f9591291365

阶段四:在RecyclerView中使用DataBinding

本阶段是在RecyclerView中使用DataBinding,所以两者结合的时候,Adapter中方法略有不不同,个人理解是要将ViewHolder和DataBinding结合,所以方法有所差异

先来看一下最重要的Adapter

基类(用于管理的父类):

    public abstract class BaseBindRecyclerViewAdapter<T> extends RecyclerView.Adapter {
    
        public List<Fruit> mList; //数据源
        
        //这个inflater我个人感觉是用于提供子类进行xml绑定时需要的参数,所以在父类中统一实现声明
        public LayoutInflater inflater;
    
        public BaseBindRecyclerViewAdapter(Context context, List<Fruit> mList) {
            this.mList = mList;
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        @Override
        public int getItemCount() {
            return mList.size();
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return onCreateMyViewHolder(parent,viewType);
        }
    
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            onBindMyViewHolder(holder, position);
        }
    
        //获取Item布局
        public abstract RecyclerView.ViewHolder onCreateMyViewHolder(ViewGroup parent, int viewType);
    
        //绑定数据
        public abstract void onBindMyViewHolder(RecyclerView.ViewHolder holder, int position);
    }

再来看看具体实现的子类,此处以RecyclerviewAdapter.java为例

    public class RecyclerviewAdapter extends BaseBindRecyclerViewAdapter<RecyclerviewAdapter.ViewHolder> {
    
        //数据集
        List<Fruit> list;
    
        public RecyclerviewAdapter(Context context,List<Fruit> list){
            super(context,list);
            this.list = list;
        }
    
        //这个方法有所不同,绑定xml的方式转为用Binding进行绑定,然后把binding当做参数用于返回一个ViewHolder
        @Override
        public RecyclerView.ViewHolder onCreateMyViewHolder(ViewGroup parent, int viewType) {
            Item1Binding binding = DataBindingUtil.inflate(inflater,R.layout.item_1,parent,false);
            return new ViewHolder(binding);
        }
    
        //这个方法也不一样,设置Bean的方式改为在binding中设置
        @Override
        public void onBindMyViewHolder(RecyclerView.ViewHolder holder, int position) {
            Fruit fruitBean =  list.get(position);
            ((ViewHolder) holder).getBinding().setFruit(fruitBean);
            ((ViewHolder) holder).getBinding().executePendingBindings(); //解决databinding闪烁问题
    
        }
    
            
        @Override
        public int getItemCount() {
            return list.size();
        }
    
        //ViewHolder类有不同,不在进行繁琐的findById的绑定,绑定工作由DataBinding进行,DataBinding作为ViewHolder的参数。
        public static class ViewHolder extends RecyclerView.ViewHolder{
    
            private Item1Binding binding;
    
            public Item1Binding getBinding() {
                return binding;
            }
    
            public ViewHolder(Item1Binding binding) {
                super(binding.getRoot());
    
                this.binding = binding;
            }
        }
    }

MainActivity

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //改为DataBinding绑定xml的方式
        ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);

        List<Fruit> list = initData();
        //以下设置项唯一差别就是不是直接在RecyclerView设置,而是转为在binding下的RecycleView中设置。
        binding.RecycleView.setLayoutManager(new LinearLayoutManager(this));
        binding.RecycleView.setAdapter(new RecyclerviewAdapter(this,list));
        binding.RecycleView.addItemDecoration(new DividerItemDecoration(this,1));

    }

xml以及Bean和以上DataBing代码中一样。

阶段五:使用MVVM架构+DataBinding实现RecyclerView

既然提到了MVVM就不得不总结一下android三个框架:MVC,MVP,MVVM

我自己又敲了一个思路清晰的简易版MVVM Demo,助于了解MVVM项目结构。(以下言论基于自己理解)
首先MVVM项目分为几个部分:(但是我分成了6个类比不代表只需要6个java就完事了!)

先来总结一下我在敲代码过程中体会到的每个角色的作用

上代码

Bean代码和从前一样就不记录了

可参考文档

    https://www.jianshu.com/p/4f9591291365
上一篇 下一篇

猜你喜欢

热点阅读