2016-04-18 12 views
0

Also versuche ich ein GridView zu erstellen, das Bilder von meinem Server lädt, auf dem Parse API läuft.GridView lädt Objekte nur, wenn geklickt wird

Das Problem, das ich habe, ist, wenn ich die Bilder vom Server in die GridView laden, muss ich auf das Fragment klicken, um sie auf dem Bildschirm zu laden.

Ich habe keine Ahnung, warum das passiert.

Das ist mein AsyncTask:

private class RemoteDataTask extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     thumbItemsList = new ArrayList<PostItems>(); 
     final String userObjectID = ProfileActivity.objectID; 
     ParseQuery<ParseUser> query = ParseUser.getQuery(); 
     query.getInBackground(userObjectID, new GetCallback<ParseUser>() { 
      @Override 
      public void done(ParseUser parseUser, ParseException e) { 
       if (e == null) { 
        try { 
         ParseQuery<ParseObject> postQuery = new ParseQuery<ParseObject>(
           "Post"); 
         postQuery.whereEqualTo("user", parseUser); 
         postQuery.orderByDescending("createdAt"); 
         objectList = postQuery.find(); 
         for (final ParseObject parseObject : objectList) { 
          thumbItems = new PostItems(); 
          String first_name = parseObject.getString("first_name"); 
          String last_name = parseObject.getString("last_name"); 
          thumbItems.setName(first_name + " " + last_name); 
          ParseFile image = (ParseFile) parseObject.get("image"); 
          image.getDataInBackground(new GetDataCallback() { 
           @Override 
           public void done(byte[] bytes, ParseException e) { 
            if (e == null) { 
             Bitmap userImage = BitmapFactory.decodeByteArray(bytes, 0 
               , bytes.length); 
             thumbItems.setImage(userImage); 
            } else { 
             Log.d("ParseException", "Error: " + e.getMessage()); 
             e.printStackTrace(); 
            } 
           } 
          }); 
          thumbItemsList.add(thumbItems); 
         } 
        } catch (ParseException e1) { 
         e1.printStackTrace(); 
        } 
       } else { 
        e.printStackTrace(); 
        Log.i("ParseException", e.getMessage()); 
       } 
      } 
     }); 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     gridViewAdapter = new GridViewAdapter(getContext(), thumbItemsList); 
     gridView.setAdapter(gridViewAdapter); 
     swipeRefreshLayout.setRefreshing(false); 
    } 
} 

Und das ist mein Gridview-Adapter:

package co.eshg.limo4.adapter; 

import android.content.Context; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.util.ArrayList; 
import java.util.List; 

import co.eshg.limo4.PostActivity; 
import co.eshg.limo4.R; 
import co.eshg.limo4.data.PostItems; 
import co.eshg.limo4.data.GridViewItem; 
import co.eshg.limo4.data.ThumbnailItems; 

public class GridViewAdapter extends BaseAdapter implements View.OnClickListener { 
Context context; 
LayoutInflater inflater; 
private List<PostItems> thumbnailsItemsList = null; 
private ArrayList<PostItems> arrayList; 

public GridViewAdapter(Context context, List<PostItems> thumbnailItemsList) { 
    this.context = context; 
    this.thumbnailsItemsList = thumbnailItemsList; 
    inflater = LayoutInflater.from(context); 
    this.arrayList = new ArrayList<>(); 
    this.arrayList.addAll(thumbnailItemsList); 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.imgThumb: 

      break; 
    } 
} 

public class ViewHolder { 
    GridViewItem gridViewItem; 
} 

@Override 
public int getCount() { 
    return thumbnailsItemsList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return thumbnailsItemsList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(final int position, View view, ViewGroup parent) { 
    ViewHolder holder; 
    if (view == null) { 
     holder = new ViewHolder(); 
     view = inflater.inflate(R.layout.profile_viewpager_tab1_children, null); 
     holder.gridViewItem = (GridViewItem) view.findViewById(R.id.imgThumb); 
     view.setTag(holder); 
    } else { 
     holder = (ViewHolder) view.getTag(); 
    } 
    final Bitmap image = thumbnailsItemsList.get(position).getImage(); 
    holder.gridViewItem.setImageBitmap(image); 

    holder.gridViewItem.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(context, PostActivity.class); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      image.compress(Bitmap.CompressFormat.PNG, 100, stream); 
      byte[] byteArray = stream.toByteArray(); 

      intent.putExtra("PostImage", byteArray); 
      intent.putExtra("FullName", thumbnailsItemsList.get(position).getName()); 
      context.startActivity(intent, null); 
     } 
    }); 

    return view; 
} 
} 

Was ich bisher versucht wird, ein lokales Bild von meinem ziehbar Ordner anstelle des Bildes geladen vom Server, und das funktioniert perfekt. Ich habe das getan, indem ich diese Linie vom Adapter ersetzte: final Bitmap image = thumbnailsItemsList.get(position).getImage(); mit final Bitmap image = BitmapFactory.decodeResource(context.getResources(), R.drawable.dairy_back);

Irgendwelche Hilfe würden geschätzt.

Antwort

0

image.getDataInBackground

diese Codezeile werden die Daten vom Server erhalten. Es wird eine Weile dauern. Aber du legst es auf Thread. So wird es thumbItemsList.add (thumbItems) ausführen, bevor Sie die Bitmap vom Server erhalten. Dies liegt daran, dass die Rasteransicht das Bild nicht lädt, da die Array-Liste immer noch nicht den Bitmap-Wert hat, aber Sie haben es bereits auf dem Adapter hinzugefügt.

Sie sollten thumbItems.setUrl (stringUrlImages) hinzufügen und image.getDataInBackground in getView Methode bewegen

Verwandte Themen