经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android Studio教程11-RecycleView的使用
来源:cnblogs  作者:Bricker666  时间:2019/1/22 9:43:49  对本文有异议

目录

1. RecyclerView

1.1. Add support library

  1. dependencies {
  2.     implementation 'com.android.support:recyclerview-v7:28.0.0'
  3. }

1.2. 将RecyclerView添加到布局

此文件命名为:activity_recycle_demo.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     android:orientation="vertical"
  8.     tools:context=".RecycleDemoActivity">
  9.  
  10.     <LinearLayout
  11.         android:id="@+id/layout01"
  12.         android:layout_width="match_parent"
  13.         android:layout_height="wrap_content"
  14.         android:orientation="horizontal"
  15.         >
  16.  
  17.         <Button
  18.             android:id="@+id/linearLayout_recycle"
  19.             android:layout_width="wrap_content"
  20.             android:layout_height="wrap_content"
  21.             android:text="线性布局"/>
  22.  
  23.         <Button
  24.             android:id="@+id/grid_recycle"
  25.             android:layout_width="wrap_content"
  26.             android:layout_height="wrap_content"
  27.             android:gravity="center"
  28.             android:text="网格布局"/>
  29.  
  30.         <Button
  31.             android:id="@+id/staggeredLayout_recycle"
  32.             android:layout_width="wrap_content"
  33.             android:layout_height="wrap_content"
  34.             android:text="瀑布布局"/>
  35.  
  36.     </LinearLayout>
  37.  
  38.  
  39.     <android.support.v7.widget.RecyclerView
  40.         android:id="@+id/my_recycler_view"
  41.         android:layout_width="match_parent"
  42.         android:layout_height="match_parent">
  43.  
  44.     </android.support.v7.widget.RecyclerView>
  45.  
  46. </LinearLayout>

1.3. 主actiivty中如何调用recycleview对象

RecycleDemoActivity.java

  1. package com.haoch95.fristapp;
  2.  
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.support.v7.widget.DefaultItemAnimator;
  6. import android.support.v7.widget.DividerItemDecoration;
  7. import android.support.v7.widget.GridLayoutManager;
  8. import android.support.v7.widget.LinearLayoutManager;
  9. import android.support.v7.widget.RecyclerView;
  10. import android.support.v7.widget.StaggeredGridLayoutManager;
  11. import android.view.Menu;
  12. import android.view.MenuItem;
  13. import android.view.View;
  14. import android.widget.Button;
  15. import android.widget.TextView;
  16. import android.widget.Toast;
  17.  
  18. import java.util.ArrayList;
  19. import java.util.List;
  20.  
  21. public class RecycleDemoActivity extends AppCompatActivity {
  22.  
  23.     private Button linearBT, gridBT, starBT;
  24.  
  25.     private RecyclerView mRecyclerView;
  26.     private RecycleAdapter mMyAdapter;
  27.     private RecyclerView.LayoutManager mLayoutManager;
  28.     private List<String> list;
  29.  
  30.  
  31.     @Override
  32.     protected void onCreate(Bundle savedInstanceState) {
  33.         super.onCreate(savedInstanceState);
  34.         setContentView(R.layout.activity_recycle_demo);
  35.  
  36.         linearBT = (Button)findViewById(R.id.linearLayout_recycle);
  37.         gridBT = (Button)findViewById(R.id.grid_recycle);
  38.         starBT = (Button)findViewById(R.id.staggeredLayout_recycle);
  39.         // RecyclerView的三部曲 01: 获取RecyclerView对象
  40.         mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
  41.  
  42.         initData();
  43.  
  44.         linearBT.setOnClickListener(new ButtonClicked());
  45.         gridBT.setOnClickListener(new ButtonClicked());
  46.         starBT.setOnClickListener(new ButtonClicked());
  47.  
  48.  
  49.  
  50.  
  51. //        // 添加水平分割线
  52. //        mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
  53.  
  54.     }
  55.  
  56.     private void initData() {
  57.         list = new ArrayList<>();
  58.         for (int i=0;i<20;i++){
  59.             list.add("Item" + i);
  60.         }
  61.     }
  62.  
  63.     class ButtonClicked implements View.OnClickListener {
  64.         @Override
  65.         public void onClick(View v) {
  66.             switch (v.getId()){
  67.                 case R.id.linearLayout_recycle:
  68.                     mLayoutManager = new LinearLayoutManager(getApplicationContext());
  69.                     break;
  70.                 case R.id.grid_recycle:
  71.                     mLayoutManager = new GridLayoutManager(getApplicationContext(),4);
  72.                     break;
  73.                 case R.id.staggeredLayout_recycle:
  74.                     //如果传入 StaggeredGridLayoutManager.VERTICAL则该布局支持纵向滑动,那么前面的 4 则指的是 4列。
  75.                     //如果传入 StaggeredGridLayoutManager.HORIZONTAL,则该布局支持横向滑动,那么前面的4 则指的是 4行
  76.                     mLayoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);
  77.                     break;
  78.                 default:
  79.                     mLayoutManager = new LinearLayoutManager(getApplicationContext());
  80.                     break;
  81.             }
  82.             //RecyclerView的三部曲 02:设置布局管理器
  83.             mRecyclerView.setLayoutManager(mLayoutManager);
  84.             mRecyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(),DividerItemDecoration.VERTICAL));
  85.             // RecyclerView的三部曲 03: 添加适配器,适配器需要重写
  86.             mMyAdapter = new RecycleAdapter(list, getApplicationContext());
  87.             mRecyclerView.setAdapter(mMyAdapter);
  88.             //设置Item增加、移除动画
  89.             mRecyclerView.setItemAnimator(new DefaultItemAnimator());
  90.  
  91.         }
  92.     }
  93.  
  94.     @Override
  95.     public boolean onCreateOptionsMenu(Menu menu) {
  96.         getMenuInflater().inflate(R.menu.menu, menu);
  97.         return true;
  98.     }
  99.  
  100.     @Override
  101.     public boolean onOptionsItemSelected(MenuItem item) {
  102.         switch (item.getItemId()) {
  103.             case R.id.add:
  104.                 mMyAdapter.addData(1);
  105.                 break;
  106.             case R.id.delete:
  107.                 mMyAdapter.removeData(1);
  108.                 break;
  109.         }
  110.         return true;
  111.     }
  112. }

1.4. 重写定义Adapter

RecycleAdapter

  1. package com.haoch95.fristapp;
  2.  
  3. import android.content.Context;
  4. import android.support.annotation.NonNull;
  5. import android.support.v7.widget.RecyclerView;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.TextView;
  10. import android.widget.Toast;
  11.  
  12. import java.util.List;
  13. import java.util.Random;
  14.  
  15. public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.MyViewHolder> {
  16.  
  17.     private List<String> mList;
  18.     private Context context;
  19.  
  20.     public RecycleAdapter(List<String> list, Context context){
  21.         this.mList = list;
  22.         this.context = context;
  23.     }
  24.  
  25.     @Override
  26.     public int getItemCount() {
  27.         return mList.size();
  28.     }
  29.  
  30.  
  31.     public class MyViewHolder extends RecyclerView.ViewHolder {
  32.  
  33.         public TextView mView;
  34.  
  35.         public MyViewHolder(@NonNull View itemView) {
  36.             super(itemView);
  37.             mView = itemView.findViewById(R.id.text_view);
  38.         }
  39.     }
  40.  
  41.     //创建ViewHolder
  42.     //onCreateViewHolder方法创建一个viewHolder,viewholder可以理解为一条数据的展示布局,这里我们自定义类LinearViewHolder创建一个只有TextView的item
  43.     //这里我们需要创建每条布局使用的layout:recycle_item
  44.     @NonNull
  45.     @Override
  46.     public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
  47.         return new MyViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycle_item, viewGroup, false));
  48.     }
  49.  
  50.  
  51.     //填充视图
  52.     //onBindViewHolder方法为item的UI绑定展示数据
  53.     @Override
  54.     public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
  55.         holder.mView.setText(mList.get(position));
  56.  
  57.         holder.itemView.setOnClickListener(new View.OnClickListener(){
  58.  
  59.             @Override
  60.             public void onClick(View v) {
  61.                 Toast.makeText(context, "点击子项"+position, Toast.LENGTH_SHORT).show();
  62.             }
  63.         });
  64.  
  65.     }
  66.  
  67.     public void addData(int position) {
  68.         mList.add(position, "Insert One");
  69.         notifyItemInserted(position);
  70.     }
  71.  
  72.     public void removeData(int position) {
  73.         mList.remove(position);
  74.         notifyItemRemoved(position);
  75.     }
  76.  
  77.     public void clearALL(){
  78.         mList.clear();
  79.         notifyDataSetChanged();
  80.     }
  81.  
  82.  
  83. }

2. 实例

本节中的所有代码已上传到:https://github.com/haochen95

原文链接:http://www.cnblogs.com/haochen273/p/10300790.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号