2017-02-15 3 views
2

In diesem Codefragment mache ich eine ParseQuery, um Objekte basierend auf einer Bedingung abzurufen. Wenn ich am Anfang des for-Blocks einen Unterbrechungspunkt platziere, kann ich innerhalb der done-Methode die Anzahl der Objekte sehen, die ich habe, die ich abrufen möchte, während ich jedes Element zum listItems-Array hinzufüge, Aber wenn ich durch den letzten Haltepunkt @ return listItems blicke und den Listenpunkt trifft, ist das Array listitems null.listitems gibt null zurück, von einer ParseQuery (Edited)

Ich versuchte, einige Beispiele aus der Antwort von SO zu folgen, aber ich kann es nicht herausfinden. In der Rückfrage ruft es die Objekte ab, aber ich weiß nicht, wie man die Ergebnisse dem Objekt listitems zuordnet.

Könnte mir jemand sagen, was ich hier falsch mache, habe ich mein Problem bis zu diesem Code-Schnipsel verfolgt.

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

In meiner Fragment-Klasse instanziieren ich ein neues RecyclerView, die den Rückgabewert aus dem getHeader() und GetListItems() Methoden und geben diese Werte an meine RecyclerView Adapter Klasse, für die Verarbeitung erfolgt.

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

Dies ist meine benutzerdefinierte Adapterklasse

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

Und hier ist meine ListItem Klasse

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

Statt der Rückkehr können Sie die Liste innerhalb der Callback-Prozess? –

+0

@Abhijith könnten Sie mehr ausarbeiten, sagen Sie, anstatt die Liste zurück zu geben, die Methodensignatur zu öffentlichen void getListItems() zu ändern, die Verarbeitung ist fertig und die listitems gesetzt und hinzugefügt im Callback, aber wie wirkt sich dies auf meinen Adapter das ruft die Methode auf. Hier ist der Aufruf vom Adapter, letzter RecyclerAdapter-Adapter = neuer RecyclerAdapter (getHeader(), getListItems()); –

+0

Können Sie die Frage bearbeiten, um zusätzlichen Code hinzuzufügen? –

Antwort

0

ich herausgefunden, wie die Liste zurückzukehren, danke für die Hilfe zu jeder versucht zu Hilf mir, aber für meine Lösung, den Code unten, funktioniert mein Projekt.

Für die GetListItems() -Methode, habe ich es wie so

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