2017-02-15 6 views
2

このコードスニペットでは、条件に基づいてオブジェクトを取得するためのParseQueryを作成しています。 forブロックの先頭にブレークポイントを置くと、doneメソッド内で、取得したいオブジェクトの数を確認することができます。これを実行すると、各アイテムがlistItems配列に追加されます。しかし、私が落ち込んで最終的なブレークポイント@return listItemsを打つと、listitems配列はnullになります。ListitemsがParseQueryからnullを返す(編集済み)

私は、SOからの回答からいくつかの例を追いかけるつもりでしたが、それを理解できないようです。コールバックではオブジェクトを取得しますが、結果をlistitemsオブジェクトに割り当てる方法はわかりません。

誰かが私がここで間違っていることを教えてもらえますか、このコードスニペットまで私の問題を追跡しました。私のフラグメントのクラスで

public List<ListItem> getListItems() 
{ 
    final List<ListItem> listItems = new ArrayList<ListItem>(); 

    ParseUser currentUser = ParseUser.getCurrentUser(); 
    ParseQuery<ParseObject> postQuery = ParseQuery.getQuery("posts"); 

    postQuery.whereEqualTo("username", currentUser.getUsername()); 
    postQuery.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(List<ParseObject> objects, ParseException e) { 
      if (e == null) { 
       for (ParseObject object : objects) { 
        ListItem item = new ListItem(); 
        ParseFile imgFile = object.getParseFile("pic"); 
        item.setPostImage(imgFile); 
        listItems.add(item); 
       } 
      } 
     } 
    }); 

    return listItems; 
} 

は、私が処理のために、のgetHeader()とgetListItems()メソッドから返された値を取り、私のRecyclerViewアダプタクラスにこれらの値を渡す新しいRecyclerViewをインスタンス化します。

final RecyclerAdapter adapter = new RecyclerAdapter(getHeader(), getListItems()); 

これは私がみんなに助けに感謝をしようとすると、リストを返す方法を考え出し

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

private static final int TYPE_HEADER = 0; 
private static final int TYPE_ITEM = 1; 

private Header header; 
private List<ListItem> listItems; 

public RecyclerAdapter(Header header, List<ListItem> listItems) 
{ 
    if (header == null) { 
     throw new IllegalArgumentException("Header may not be null"); 
    } 

    this.header = header; 
    this.listItems = listItems; 
} 

public boolean isHeader(int position) { 
    return position == 0; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if(viewType == TYPE_HEADER) 
    { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.header, parent, false); 
     return new VHHeader(v); 
    } 
    else if(viewType == TYPE_ITEM) 
    { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.model, parent, false); 
     return new VHItem(v); 
    } 

    throw new RuntimeException("There is no type that matches the type " + viewType + " + make sure your using types correctly"); 

} 

private ListItem getItem(int position) 
{ 
    return listItems.get(position); 
} 


@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

    if (isHeader(position)) { 
     if(holder instanceof VHHeader) 
     { 
      VHHeader VHheader = (VHHeader)holder; 
      VHheader.txtFullname.setText(header.getFullname()); 
      VHheader.txtWeb.setText(header.getWeb()); 
      VHheader.txtBio.setText(header.getBio()); 
      VHheader.txtSwaggCount.setText(String.valueOf(header.getSwaggCount())); 
      VHheader.txtFollowerCount.setText(String.valueOf(header.getFollowerCount())); 
      VHheader.txtFollowingCount.setText(String.valueOf(header.getFollowingCount())); 

      Bitmap bmp = null; 
      try { 
       bmp = BitmapFactory.decodeStream(header.getProfileImage().getDataStream()); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
      VHheader.cImageView.setImageBitmap(bmp); 

      VHheader.btnEditProfile.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Context context = view.getContext(); 
        Intent editProfileIntent = new Intent(context, EditProfileActivity.class); 
        context.startActivity(editProfileIntent); 
       } 
      }); 

      return; 
     } 
    } 

    if(holder instanceof VHItem) 
    { 
     ListItem currentItem = getItem(position - 1); 
     VHItem VHItem = (VHItem)holder; 

     Bitmap bmp = null; 
     try { 
      bmp = BitmapFactory.decodeStream(currentItem.getPostImage().getDataStream()); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     VHItem.iv.setImageBitmap(bmp); 
    } 
} 

// Need to override this method 
public int getItemViewType(int position) { 
    if(isPositionHeader(position)) 
     return TYPE_HEADER; 
    return TYPE_ITEM; 
} 

private boolean isPositionHeader(int position){ 
    return position == 0; 
} 

@Override 
public int getItemCount() { 
    return listItems.size() + 1; 
} 

private class VHHeader extends RecyclerView.ViewHolder { 
    TextView txtFullname; 
    TextView txtWeb; 
    TextView txtBio; 
    TextView txtSwaggCount; 
    TextView txtFollowerCount; 
    TextView txtFollowingCount; 
    CircleImageView cImageView; 
    Button btnEditProfile; 
    VHHeader(View itemView) { 
     super(itemView); 
     this.txtFullname = (TextView)itemView.findViewById(R.id.fullnameTV); 
     this.txtWeb = (TextView)itemView.findViewById(R.id.webTV); 
     this.txtBio= (TextView)itemView.findViewById(R.id.bioTV); 
     this.txtSwaggCount = (TextView)itemView.findViewById(R.id.swaggsCountTV); 
     this.txtFollowerCount = (TextView)itemView.findViewById(R.id.followerCountTV); 
     this.txtFollowingCount = (TextView)itemView.findViewById(R.id.followingCountTV); 
     this.cImageView = (CircleImageView)itemView.findViewById(R.id.avaImageIV); 
     this.btnEditProfile = (Button)itemView.findViewById(R.id.editProfileBtn); 
    } 
} 

private class VHItem extends RecyclerView.ViewHolder { 
    ImageView iv; 
    VHItem(View itemView){ 
     super(itemView); 
     this.iv = (ImageView)itemView.findViewById(R.id.ivListItem); 
    } 
} 

私のカスタムアダプタクラスであり、ここで私のListItemのクラス

ある
public class ListItem { 

private ParseFile postImage; 
private int id; 

public ListItem() { 
} 

public ParseFile getPostImage() { 
    return postImage; 
} 

public void setPostImage(ParseFile postImage) { 
    this.postImage = postImage; 
} 
+0

の代わりに返すコールバック内のリストを処理することができますように、私はそれを変更? –

+0

@Abhijithもっと詳しく説明できますか?リストを返す代わりに、メソッドのシグネチャをpublic void getListItems()に変更すると、処理がすべて完了し、listitemsが設定され、コールバックに追加されますが、メソッドを呼び出します。アダプタからの呼び出し、最後のRecyclerAdapterアダプタ=新しいRecyclerAdapter(getHeader()、getListItems()); –

+0

質問を編集してコードを追加できますか? –

答えて

0

助けてください。私のソリューションでは、以下のコードは、私のプロジェクトが働いています。 getListItems()メソッドについては

ので

public List<ListItem> getListItems() 
{ 
    ParseUser currentUser = ParseUser.getCurrentUser(); 
    ParseQuery<ParseObject> postQuery = ParseQuery.getQuery("posts"); 
    postQuery.whereEqualTo("username", currentUser.getUsername()); 
    List<ParseObject> objects; 
    List<ListItem> listItems = new ArrayList<>(); 
    try { 
     objects = postQuery.find(); 
     for (ParseObject object : objects) { 
      ListItem item = new ListItem(); 
      ParseFile imgFile = object.getParseFile("pic"); 
      item.setPostImage(imgFile); 
      listItems.add(item); 
     } 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    return listItems; 
} 
関連する問題