Android 开发中使用 Recyclerview

magic00 2019-12-24

Android 开发中 Recyclerview 的使用

Overview

学习自:博客园 CSDN Android 官方文档

Android 呈现数据的方式有很多种,使用自定义控件,使用 ListView,使用Recyclerview.

那么我们今天看一下Android 中 如是使用 Recyclerview


声明依赖性

官方文档所示,我们需要声明以下依赖性:

dependencies {
    implementation "androidx.recyclerview:recyclerview:1.1.0"
    // For control over item selection of both touch and mouse driven selection
    implementation "androidx.recyclerview:recyclerview-selection:1.1.0-beta01"
}

布局文件设置

我们先来看一下源码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tool="http://schemas.android.com/tools"
    android:id="@+id/drawLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:animateLayoutChanges="true"
    android:orientation="vertical"
    tool:context=".MainPackage.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbarLibrary"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#517EB9"
            android:fitsSystemWindows="true"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/Theme.AppCompat.Light"
            app:titleTextColor="#fff" />


        <AutoCompleteTextView
            android:id="@+id/auto2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:text="MultiAutoCompleteTextView" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/LibraryListview"
            class="androidx.appcompat.app.AlertController$RecycleListView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:overScrollMode="never">

        </androidx.recyclerview.widget.RecyclerView>

        <MultiAutoCompleteTextView
            android:id="@+id/multiAutoCompleteTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="MultiAutoCompleteTextView" />

    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationViewLilbary"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/library_items_menu" />
</androidx.drawerlayout.widget.DrawerLayout>

这样 我们的布局文件就创建完成了。这边不做过多的解释。


活动中使用我们的Recyclerview

我们已经在布局文件中创建好了我们的Recyclerview

接着我们看一下如何使用它吧。

public class LibraryMainActivity extends AppCompatActivity {
    NavigationView navigationView;
    DrawerLayout drawerLayout;
    TextView txtEmail;
    TextView txtName;
    ImageView UserImageView;
    List<String> listImage = new ArrayList<>();
    Toolbar toolbar;
    RecyclerView recyclerView;
    LinearLayoutManager linearLayoutManager;
    List<String> list = new ArrayList<>();
    List<String> SearchNameList = new ArrayList<>();
    AutoCompleteTextView SearchAuto;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_library_main);
        //region -实例化基础控件等-
        drawerLayout = findViewById(R.id.drawLayout);
        navigationView = findViewById(R.id.navigationViewLilbary);
        txtEmail = findViewById(R.id.txtEmail);
        txtName = findViewById(R.id.txtName);
        toolbar = findViewById(R.id.toolbarLibrary);
        toolbar.setTitle("欢迎使用图书馆");
        toolbar.setLogo(R.drawable.ic_action_name);
        this.setSupportActionBar(toolbar);
        // endregion
        //region -基础设置-
        toolbar.setOnClickListener(v -> {
            drawerLayout.openDrawer(navigationView);
        });
        GetUserInformation();
        //设置 沉浸式体验
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }
        //endregion
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView = findViewById(R.id.LibraryListview);
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        int a = 100;
        for (int i = 0; i < a; i++) {
            list.add("第一行代码 - 郭霖\t(第二版)" + String.valueOf(i));
            SearchNameList.add("第一行代码 - 郭霖\t(第二版)" + String.valueOf(i));
        }
        recyclerView.setAdapter(new RecyclerViewAdapter(LibraryMainActivity.this, list));
        SearchAuto = findViewById(R.id.auto2);
        SearchAuto.setAdapter(new ArrayAdapter<>(LibraryMainActivity.this, android.R.layout.simple_spinner_dropdown_item, SearchNameList));
    }
    
    
    /**
      *@ClassName:LibraryMainActivity - 用于获取 当前登录用户的个人信息,头像等。
      *@author:CaoJiaHao
      *@Param:
     **/
    void GetUserInformation() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                String ImageString = Global.HttpGet("UserInformations/" + SessionClass.userClass.get(0).getUserId(), null);
                listImage = UserImageJSON.modelJson(ImageString);
                String imageString = listImage.get(0);
                final Bitmap Userbitmap = Global.StringToBitmap(imageString);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        View viewHearder = navigationView.inflateHeaderView(R.layout.nav_header);
                        txtName = viewHearder.findViewById(R.id.txtName);
                        txtEmail = viewHearder.findViewById(R.id.txtEmail);
                        UserImageView = viewHearder.findViewById(R.id.UserImageView);
                        txtName.setText("User Name: " + SessionClass.userClass.get(0).getUserName());
                        txtEmail.setText("Email: " + SessionClass.userClass.get(0).getEmail());
                        UserImageView.setImageBitmap(Userbitmap);
                        //处理当前登录这没有头像的情况
                        if (Userbitmap == null || Userbitmap.isRecycled())
                            UserImageView.setImageResource(R.drawable.user_image);
                    }
                });
            }
        }).start();
    }
}

这样我们在活动中使用使用我们的Recyclerview就完成了。
当时我们可以看到,在程序中我们使用到了适配器。
接下来我们就看一下适配器是如何编写的。


android Recyclerview 的适配器

如果之前学过Recyclerview的人可能知道。在Recyclerview中并没有给你封装好的单击事件和长按事件等。那么这就意味着。我们需要自己写。

我们先看一下我们的适配器源码:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private List<String> mList = new ArrayList<>();
    TextView textView;
    ImageView booksImage;
    public RecyclerViewAdapter(Context mContext, List<String> mList) {
        this.mContext = mContext;
        this.mList = mList;
    }
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.r_view_items, parent, false);
        textView = view.findViewById(R.id.text_view);
        booksImage = view.findViewById(R.id.booksImageView);
        return new ViewHodel(view);
    }
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        textView.setText(mList.get(position));
        holder.itemView.setOnClickListener(v -> {
            Toast.makeText(mContext, "Hello android", Toast.LENGTH_SHORT).show();
        });
        holder.itemView.setOnLongClickListener(v -> {
            View viewInformation = LayoutInflater.from(mContext).inflate(R.layout.book_information, null, false);
            ImageView imageView = viewInformation.findViewById(R.id.booksInformationImageView);
            TextView txtName = viewInformation.findViewById(R.id.txtBookName);
            txtName.setText(textView.getText());
            Bitmap bitmap = ((BitmapDrawable) booksImage.getDrawable()).getBitmap();
            imageView.setImageBitmap(bitmap);
            AlertDialog dialog = new AlertDialog.Builder(mContext).setView(viewInformation).show();
            return true;
        });
    }
    @Override
    public int getItemCount() {
        return mList.size();
    }
}
class ViewHodel extends RecyclerView.ViewHolder {
    private TextView txtName;
    public ViewHodel(@NonNull View itemView) {
        super(itemView);
        txtName = itemView.findViewById(R.id.text_view);
    }
}

然后我们根据源码来看一下:

  1. 我们创建一个RecyclerviewAdapter并且继承于RecyclerView.Adapter<RecyclerView.ViewHolder>
  2. 然后我们创建一个集合,调用活动的Context
  3. 然后我们创建了我们的构造函数。
  4. 如果我么正确的继承了我们的对应函数,我们需要重写 我们的 onCreateViewHolder方法。
  5. 这边我们需要加载我们的自定义Items布局。
  6. 然后这边我直接将我们的控件初始换完成了。当时我不知道对不对。
  7. 接着就是我们的onBindViewHolder方法了。这边我注册了部分的点击事件。
  8. 最后是我们的getItemCount();的方法了。他的主要用途返回我们的items数量。
    这样我觉得我已经完成了。

看一下效果:
Android 开发中使用 Recyclerview


这篇可能不太对因为个人工作问题,在开发中不会去使用任何依赖。所以这篇只是拓展视野而已。??

相关推荐