Я создал образец приложения с макетом вкладок с несколькими повторными просмотрами. Разметка вкладок и просмотр ресайклеров при прокрутке или прокрутке отображаются
, но здесь, когда я прокручиваю 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;
}
}
Насколько велики вам изображения? – asadmshah
ниже 700x700 и менее 80kb в размере –
Я думаю, ваши изображения могут быть слишком большими. У вас есть xxhdpi-xhdpi-hdpi-mdpi - и т. Д.? Если вы не поставите свои изображения в drawable-nodpi. – z3n105