2017-05-02 6 views
1

Ich versuche App mit verschiedenen Kategorien zu erstellen, jede Kategorie Es hat eine Sammlung von Bildern, ich begann mit der ersten Kategorie mit (10 Bilder) funktioniert gut, aber wenn ich in einer anderen Kategorie zu bewegen meine Anwendung arbeiten langsam .I'm läuft mit GridViewLangsame Leistung beim Verschieben zwischen Kategorie (Artikelnavigation)

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ArrayList<String> movieList = new ArrayList<>(); 
    movieList.add("https://scontent-waw1-1.xx.fbcdn.net/v/t1.0- 9/18199348_430451573995024_7473960282002692779_n.jpg?oh=8667ffcd3ccb66892fcf4e7330f24e61&oe=59B88B8F"); 
    View v = inflater.inflate(R.layout.fragment_art, container, false); 
    myGrid= (GridView) v.findViewById(R.id.gridViewCategory); 
    adapter =new CategoryAdapter(getActivity(),movieList); 
    myGrid.setAdapter(adapter); 
    return v; 
    } 

    } 

class CategoryAdapter extends BaseAdapter { 
    private Context context; 
    private ArrayList<String> imageId=new ArrayList<String>(); 
    CategoryAdapter(Context context,ArrayList<String> imageId){ 
     this.context=context; 
     this.imageId=imageId; 
    } 
    @Override 
    public int getCount() { 
    return imageId.size(); 
} 
@Override 
public Object getItem(int position) { 
    return imageId.get(position); 
} 
@Override 
public long getItemId(int position) { 
    return position; 
} 
class ViewHolder{ 
    ImageView CategoryImage; 
    ViewHolder(View view){ 
     CategoryImage = (ImageView) view.findViewById(R.id.cat_imageView); 
    } 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row=convertView; 
    ViewHolder holder=null; 
    if(row == null){ 
     LayoutInflater inflater= (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
     row=inflater.inflate(R.layout.picture_item,parent,false); 
     holder = new ViewHolder(row); 
     row.setTag(holder); 
    } 
    else{ 
     holder=(ViewHolder) row.getTag(); 
    } Glide.with(context).load(imageId.get(position)).placeholder(R.drawable.load).int  o(holder.CategoryImage); 
     return row; 
    } 

} 

Antwort

1

AsyncTasks ist Ihr Schlüssel!

// ein AsyncTask Mit den langsamen Bilder in einem Hintergrundthread

new AsyncTask<ViewHolder, Void, Bitmap>() { 
    private ViewHolder v; 

    @Override 
    protected Bitmap doInBackground(ViewHolder... params) { 
     v = params[0]; 
     return mFakeImageLoader.getImage(); 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     super.onPostExecute(result); 
     if (v.position == position) { 
      // If this item hasn't been recycled already, hide the 
      // progress and set and show the image 
      v.progress.setVisibility(View.GONE); 
      v.icon.setVisibility(View.VISIBLE); 
      v.icon.setImageBitmap(result); 
     } 
    } }.execute(holder); 

Oder Sie können laden aktivieren auf Ihrem gridview fastscrolling. Wenn Sie zu einer neuen Ansicht des Rasters wechseln, können Sie die nicht benötigten Bitmaps recyceln.

Wenn diese nicht helfen, versuchen Sie eine Bibliothek wie Glide zu verwenden.

Hoffe, das hilft!

+0

danke für die Antwort bitte, wenn Sie mehr erklären können, wie ich 'AsyncTask' in meinem Code auch verwenden kann, ich arbeite mit ** Glide Library ** und ich benutze' glide.fastcrollenabled (true) 'aber die Verzögerung noch – MrMR

+1

Ich glaube, Ihr Problem besteht darin, dass Sie Ihre Bitmaps nicht recyceln. Du behälst einfach eine Menge großer Datenobjekte und ziehst den Hauptthread an! –

+1

@ A. Petrizza yeeeeeeeeees du hast Recht Wenn ich meine Anwendung zum ersten Mal starte, werden Bilder hochgeladen, aber wenn ich sie wieder starte, erscheinen Bilder ohne Ladevorgang, da Bilder im Cache gespeichert sind ** Entschuldigung für mein Englisch ** – MrMR

Verwandte Themen