2016-04-18 23 views
0

をクリックした場合にのみ、だから私はパースのAPIを実行している私のサーバーから画像をロードするGridViewを作成しようとしています。GridViewの項目を読み込み

私がいる問題は、私はGridViewコントロールにサーバーからイメージをロードするとき、私は画面上にそれらをロードするためにフラグメントをクリックする必要があります。

なぜこれが起こっているのかわかりません。

これは私の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); 
    } 
} 

そして、これが私のGridViewのアダプタです:

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; 
} 
} 

私がこれまで試したことは私の描画可能なフォルダからローカルの画像の代わりに、画像をロードしていますサーバーから、それは完全に動作します。私はアダプタからこの行を置き換えることによってそれをやった:final Bitmap image = thumbnailsItemsList.get(position).getImage();final Bitmap image = BitmapFactory.decodeResource(context.getResources(), R.drawable.dairy_back);

助けていただければ幸いです。

答えて

0

image.getDataInBackground

のコード行は、サーバーからデータを取得します。それはしばらく時間がかかります。しかし、あなたはそれをスレッドに置いています。あなたは、サーバーからのビットマップを取得する前に、だから、このthumbItemsList.add(thumbItems)を実行します。配列リストにまだビットマップ値がありませんが、すでにアダプタに追加しているので、gridviewは画像をロードしません。

あなたはthumbItems.setUrl(stringUrlImages)を追加し、GetViewメソッドにimage.getDataInBackgroundを移動する必要があります

関連する問題