RecyclerView с Gridlayoutmanager чрезвычайно медленно загружается и реагирует

#java #android #android-recyclerview #android-gridlayout #gridlayoutmanager

Вопрос:

Я создаю приложение, которое показывает сетку из 2 столбцов, с помощью recyclerview . Мой код выглядит следующим образом:

  • activity_main.xml
      <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".MainActivity">
    
     <androidx.recyclerview.widget.RecyclerView
         android:id="@ id/recycle"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
     </androidx.constraintlayout.widget.ConstraintLayout>
     
  • custom_item_layout.xml
     <shape xmlns:android="http://schemas.android.com/apk/res/android">
      <!--
         stroke with color and width for creating outer line
      -->
      <stroke
          android:width="5dp"
          android:color="#DBE2E9" />
    </shape>
     
  • row_layout.xml
      <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="wrap_content"
      android:layout_height="180dp"
      android:background="@drawable/custom_item_layout"
      android:padding="5dp">
      <!--
      grid items for RecyclerView
      -->
      <ImageView
          android:id="@ id/image"
          android:layout_width="180dp"
          android:layout_height="180dp"
          android:layout_marginStart="5dp"
          android:layout_marginTop="5dp"
          android:layout_marginEnd="5dp"
          android:scaleType="centerCrop"
          android:src="@mipmap/ic_launcher"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toTopOf="parent" />
    
      </androidx.constraintlayout.widget.ConstraintLayout>
     
  • MainActivity.java
      public class MainActivity extends AppCompatActivity {
    
      // ArrayList for all app genres
      ArrayList appNames = new ArrayList<>(Arrays.asList( "Augmented reality",
                     "Beauty", "Books amp; Reference",  "Comics", "Communication",
                     "Dating", "Entertainment", "Food amp; Drink",
                      "Games", "Kids", "Music amp; Audio", "Photography",
                      "Social", "Video Players amp; Editors"));
      ArrayList appImages = new ArrayList<>(Arrays.asList(R.drawable.a_r, R.drawable.beauty, R.drawable.ic_books,
              R.drawable.ic_smashing_book_icon_comic_book_icon_11553392583tcjc, R.drawable.comms, R.drawable.date,
              R.drawable.entertainment, R.drawable.foods, R.drawable.games,
              R.drawable.kids, R.drawable.music, R.drawable.camera,
              R.drawable.social, R.drawable.video));
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          // get the reference of RecyclerView
          RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycle);
          // set a GridLayoutManager with default vertical orientation and 2 number of columns
          GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(),2);
          recyclerView.setLayoutManager(gridLayoutManager); // set LayoutManager to RecyclerView
          //  call the constructor of CustomAdapter to send the reference and data to Adapter
          CustomAdapter customAdapter = new CustomAdapter(MainActivity.this, appNames,appImages);
          recyclerView.setAdapter(customAdapter); // set the Adapter to RecyclerView
      }
    }
     
  • CustomAdapter.java
      public class CustomAdapter extends RecyclerView.Adapter {
    
      ArrayList appNames;
      ArrayList appImages;
      Context context;
      boolean allowed = false;
      LottieAlertDialog.Builder alert;
      public CustomAdapter(Context context, ArrayList appNames, ArrayList appImages) {
          this.context = context;
          this.appNames = appNames;
          this.appImages = appImages;
      }
      @NonNull
      @Override
      public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
          // infalte the item Layout
          View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_layout, parent, false);
          // set the view's size, margins, paddings and layout parameters
          return new MyViewHolder(v);
      }
    
      @Override
      public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
          MyViewHolder mholder=(MyViewHolder) holder;
          mholder.image.setImageResource((Integer) appImages.get(position));  
      }
    
      @Override
      public int getItemCount() {
          return appNames.size();
      }
      public static class MyViewHolder extends RecyclerView.ViewHolder {
          public ImageView image;
          public MyViewHolder(View itemView) {
              super(itemView);
              this.image = (ImageView) itemView.findViewById(R.id.image);
          }
      }
    }
     

Все мои векторные активы имеют размер:

 android:width="512dp"
android:height="512dp"
android:viewportWidth="512"
android:viewportHeight="512">
 

Проблема в том , что, когда я запускаю приложение, загрузка занимает так много времени, и устройство продолжает зависать. Я понятия не имею, почему это происходит. Как мне это исправить?

Ответ №1:

Используйте библиотеки обработки изображений, такие как Glide, для загрузки изображений в imageview . Это может помочь