0

Я создал образец приложения с макетом вкладок с несколькими повторными просмотрами. app ScreenshotРазметка вкладок и просмотр ресайклеров при прокрутке или прокрутке отображаются

, но здесь, когда я прокручиваю recyclerview или салфетки между вкладками. приложения отстают и становятся очень медленными.

первым я столкнулась с OutOfMemoryError и когда я применил

android:largeHeap="true" 
android:hardwareAccelerated="true" 

в манифест, она решена. Но все-таки мое приложение сильно отстает.

(она работает очень хорошо в ЭМУЛЯТОРЕ)

пожалуйста кто-нибудь помочь мне решить мою проблему.

мой весь проект доступен в Github

RecyclerView адаптер

import android.support.design.widget.Snackbar; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 



public class VideoManager extends RecyclerView.Adapter<VideoManager.RecyclerViewHolder> { 

    public static class RecyclerViewHolder extends RecyclerView.ViewHolder { 

     TextView mName; 
     ImageView mImage,mShare,mPlay,mDownload; 

     RecyclerViewHolder(View itemView) { 
      super(itemView); 
      mName = (TextView) itemView.findViewById(R.id.title); 
      mImage = (ImageView) itemView.findViewById(R.id.image); 
      mShare = (ImageView) itemView.findViewById(R.id.share); 
      mPlay = (ImageView) itemView.findViewById(R.id.play); 
      mDownload = (ImageView) itemView.findViewById(R.id.download); 
     } 
    } 

    @Override 
    public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recyclerview_item, viewGroup, false); 
     return new RecyclerViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerViewHolder viewHolder, int i) { 
     // get the single element from the main array 

     final VideoDatabase items = VideoDatabase.VIDEO[i]; 
     // Set the values 
     viewHolder.mName.setText(items.get(VideoDatabase.Field.NAME)); 
     viewHolder.mImage.setImageResource(items.geti(VideoDatabase.Field.IMAGE)); 
     viewHolder.mImage.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Snackbar snackbar = Snackbar.make(v, "Streaming", Snackbar.LENGTH_SHORT); 
       snackbar.show(); 
      } 
     }); 
     viewHolder.mPlay.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Snackbar snackbar = Snackbar.make(v, "Play", Snackbar.LENGTH_SHORT); 
       snackbar.show(); 
      } 
     }); 
     viewHolder.mShare.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Snackbar snackbar = Snackbar.make(v, "Sharing", Snackbar.LENGTH_SHORT); 
       snackbar.show(); 
      } 
     }); 
     viewHolder.mDownload.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Snackbar snackbar = Snackbar.make(v, "Downloading", Snackbar.LENGTH_SHORT); 
       snackbar.show(); 
      } 
     }); 
    } 


    @Override 
    public int getItemCount() { 

     return VideoDatabase.VIDEO.length; 
    } 


} 

DataProvider

public class VideoDatabase { 

    // I am going to define here the projectdatabase, public static and constant, 
    // so that every class in the project will be able to read it. 
    // In a sense, we just mimic the standard behaviour of a database. 
    public static final VideoDatabase[] VIDEO = new VideoDatabase[]{ 
      new VideoDatabase("GOOD NIGHT", R.drawable.gudmorng), 
      new VideoDatabase("GOOD MORNING", R.drawable.gudnyt), 
      new VideoDatabase("GOOD NIGHT", R.drawable.gudnyt1), 
      new VideoDatabase("GOOD NIGHT", R.drawable.gudmorng), 
      new VideoDatabase("GOOD MORNING", R.drawable.gudnyt), 
      new VideoDatabase("GOOD NIGHT", R.drawable.gudnyt1), 
     }; 

    // The fields associated to the person 
    private final String mVideoName; 
    private final int mImage; 

    VideoDatabase(String name, int image) { 
     mVideoName = name; 
     mImage = image; 

    } 

    // This method allows to get the item associated to a particular id, 
    // uniquely generated by the method getId defined below 
    public static VideoDatabase getItem(int id) { 
     for (VideoDatabase item : VIDEO) { 
      if (item.getId() == id) { 
       return item; 
      } 
     } 
     return null; 
    } 

    // since mName and mPhone combined are surely unique, 
    // we don't need to add another id field 
    public int getId() { 
     return mVideoName.hashCode(); 
    } 

    public static enum Field { 
     NAME, IMAGE 
    } 

    public String get(Field f) { 
     switch (f) { 
      case NAME: 
      default: 
       return mVideoName; 
     } 
    } 

    public int geti(Field f) { 
     switch (f) { 
      case IMAGE: 

     } 
     return mImage; 
    } 
} 

TabFragment с RecyclerViews

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.widget.GridLayoutManager; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 


/** 
* A simple {@link Fragment} subclass. 
*/ 
public class Tab1_videos extends Fragment { 


    public Tab1_videos() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.tab1_videos, container, false); 

     RecyclerView rv = (RecyclerView) v.findViewById(R.id.home_recyclerview); 
     LinearLayoutManager llm = new LinearLayoutManager(getContext(),LinearLayoutManager.HORIZONTAL,false); 
     rv.setLayoutManager(llm); 
     rv.setHasFixedSize(true); // to improve performance 
     rv.setAdapter(new VideoManager()); // the projectdatabase manager is assigner to the RV 

     RecyclerView grid = (RecyclerView) v.findViewById(R.id.home_recyclerview2); 
     LinearLayoutManager llm2 = new GridLayoutManager(getContext(),2); 
     grid.setLayoutManager(llm2); 
     grid.setHasFixedSize(true); // to improve performance 
     grid.setAdapter(new VideoManager()); // the projectdatabase manager is assigner to the RV 

     return v; 
    } 


} 
+0

Насколько велики вам изображения? – asadmshah

+0

ниже 700x700 и менее 80kb в размере –

+0

Я думаю, ваши изображения могут быть слишком большими. У вас есть xxhdpi-xhdpi-hdpi-mdpi - и т. Д.? Если вы не поставите свои изображения в drawable-nodpi. – z3n105

ответ

0

Используйте любые библиотеки загрузки изображений, такие как Universal Image Loader.

здесь При использовании UIL

`DisplayImageOptions options = new DisplayImageOptions.Builder() 
       .showImageOnLoading(R.drawable.mirlogo) 
       .showImageForEmptyUri(R.drawable.gallery_no_image) 
       .showImageOnFail(R.drawable.gallery_image_fail) 
       .cacheInMemory(true) 
       .cacheOnDisk(true) 
       .considerExifParams(true) 
       .bitmapConfig(Bitmap.Config.RGB_565) 
       .build(); 

ImageLoader.getInstance().displayImage(images, viewHolder.mImage, options); 
Смежные вопросы