Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RecyclerView概念在android上是如何工作的?_Android_Android Recyclerview_Adapter_Android Cardview - Fatal编程技术网

RecyclerView概念在android上是如何工作的?

RecyclerView概念在android上是如何工作的?,android,android-recyclerview,adapter,android-cardview,Android,Android Recyclerview,Adapter,Android Cardview,我已经使用RecyclerView和CardView从网站获取教程创建了一个基本应用程序 应用程序运行良好,我有一些困惑。(我在这里显示我的全部代码) 困惑在于代码是如何一步一步地工作的。所以请澄清我的观点 我的应用程序的基本结构: 我已经创建了一个row\u data\u布局xml文件以绑定到recycler\u视图 创建了一个数据类文件(在这里我定义了我在应用程序中使用的变量) 创建了一个适配器文件(这里我想一步一步地弄清楚它是如何工作的,首先调用哪个类,为什么?) 将数据绑定到MainAc

我已经使用RecyclerView和CardView从网站获取教程创建了一个基本应用程序

应用程序运行良好,我有一些困惑。(我在这里显示我的全部代码)

困惑在于代码是如何一步一步地工作的。所以请澄清我的观点

我的应用程序的基本结构:

  • 我已经创建了一个
    row\u data\u布局
    xml文件以绑定到
    recycler\u视图
  • 创建了一个数据类文件(在这里我定义了我在应用程序中使用的变量)
  • 创建了一个适配器文件(这里我想一步一步地弄清楚它是如何工作的,首先调用哪个类,为什么?)
  • 将数据绑定到
    MainActivity
    文件上的
    RecyclerView
  • 行数据布局.xml
    文件:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/CardView"
        android:paddingBottom="16dp"
        android:layout_marginBottom="16dp">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/txt_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:text="Large Text"
                android:textAppearance="?android:attr/textAppearanceLarge" />
        </LinearLayout>
    
    </android.support.v7.widget.CardView>
    
    数据适配器类文件:

    public class Data_Adapter extends RecyclerView.Adapter<Data_Adapter.View_holder> {
        List<Data> list = Collections.emptyList();
        Context context;
    
        public Data_Adapter(List<Data> list, Context context) {
            this.list = list;
            this.context = context;
        }
    
        @Override
        public Data_Adapter.View_holder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_data_layout,parent,false);
            View_holder holder=new View_holder(v);
            return holder;
        }
    
        @Override
        public void onBindViewHolder(Data_Adapter.View_holder holder, int position) {
                holder.name.setText(list.get(position).Name);
        }
    
        @Override
        public int getItemCount() {
            return list.size();
        }
    
        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
        }
    
        public class View_holder extends RecyclerView.ViewHolder{
            CardView cv;
            TextView name;
    
            public View_holder(View itemView) {
                super(itemView);
                cv = (CardView) itemView.findViewById(R.id.CardView);
                name = (TextView) itemView.findViewById(R.id.txt_name);
            }
        }
    }
    
    公共类数据\u适配器扩展了RecyclerView.Adapter{
    List=Collections.emptyList();
    语境;
    公共数据适配器(列表、上下文){
    this.list=列表;
    this.context=上下文;
    }
    @凌驾
    public Data_Adapter.View_holder onCreateViewHolder(视图组父级,int-viewType){
    视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.row\u data\u布局,parent,false);
    视图固定器=新视图固定器(v);
    报税表持有人;
    }
    @凌驾
    public void onBindViewHolder(数据\u适配器.视图\u支架,int位置){
    holder.name.setText(list.get(position.name));
    }
    @凌驾
    public int getItemCount(){
    返回list.size();
    }
    @凌驾
    附加ToRecyclerView(RecyclerView RecyclerView)上的公共无效{
    super.onAttachedToRecyclerView(recyclerView);
    }
    公共类视图持有者扩展了RecyclerView.ViewHolder{
    卡德维尤简历;
    文本视图名称;
    公共视图(视图项视图){
    超级(项目视图);
    cv=(CardView)itemView.findViewById(R.id.CardView);
    name=(TextView)itemView.findViewById(R.id.txt\u name);
    }
    }
    }
    
    主活动文件:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            List<Data> data = fill_data();
            RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
            Data_Adapter adapter = new Data_Adapter(data,getApplicationContext());
            recyclerView.setAdapter(adapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
        }
    
        public List<Data> fill_data()
        {
            List<Data> data = new ArrayList<>();
            data.add(new Data("Bred Pit"));
            data.add(new Data("Leonardo"));
    
            return data;
        }
    }
    
    public类MainActivity扩展了AppCompatActivity{
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    列表数据=填充数据();
    RecyclerView RecyclerView=(RecyclerView)findViewById(R.id.RecyclerView);
    数据适配器=新数据适配器(数据,getApplicationContext());
    recyclerView.setAdapter(适配器);
    recyclerView.setLayoutManager(新的LinearLayoutManager(本));
    }
    公共列表填充数据()
    {
    列表数据=新的ArrayList();
    数据。添加(新数据(“繁殖坑”);
    数据。添加(新数据(“莱昂纳多”);
    返回数据;
    }
    }
    
    一旦您对RecyclerView.Adapter的工作原理有了基本的了解,就有必要深入研究它

    适配器所做的是保留一个膨胀视图池(这可以是您想要的多种类型),它用您提供的数据填充这些视图。当适配器在池中没有空视图时,它将创建一个新视图

    当视图附加到RecyclerView时,它将从池中移除,当它被分离(滚动到视图之外的某个距离)时,它将被添加回空视图池——这就是为什么在填充视图持有者时重置所有内容很重要的原因

    该函数用于创建新的空视图(由RecyclerView.ViewHolder包装)并将其添加到池中

    该函数从空池中获取一个视图,并使用您提供给适配器的数据填充该视图\

    您可以使用该方法执行特定操作,例如将ImageView的位图设置为null(分离时),以减少内存使用


    我通常不会重写,但如果您需要在适配器与RecyclerView关联时执行某些特定操作,您可以在此处执行。

    请澄清您的问题。我想逐步了解Adpeter的工作原理这是一个有用的解释。非常感谢。起初你用“空”这个词把我甩了,但我想我现在明白了。如果我理解正确,“empty”是指一个通用的GUI对象,例如widget,它是根据XML描述构建的,但没有填充任何区别数据。请原谅这个表达式,它有点像一个运行时模板。正确,empty是一个膨胀的视图(或视图层次结构),它还没有填充数据。适配器将这些(使用过的和/或未使用过的)存储在一个池中,以便循环使用——它会根据需要进行更多的充气。
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            List<Data> data = fill_data();
            RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
            Data_Adapter adapter = new Data_Adapter(data,getApplicationContext());
            recyclerView.setAdapter(adapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
        }
    
        public List<Data> fill_data()
        {
            List<Data> data = new ArrayList<>();
            data.add(new Data("Bred Pit"));
            data.add(new Data("Leonardo"));
    
            return data;
        }
    }