2017-02-15 1 views
2

이 스 니펫 코드에서는 조건을 기반으로 개체를 검색하기 위해 ParseQuery를 만들고 있습니다. for 블록의 시작 부분에 중단 점을 배치하면 완료된 메서드 내에서 내가 가지고있는 객체의 수를 볼 수 있습니다. 즉, 단계별로 각 항목이 listItems 배열에 추가되고, 하지만 마지막 중단 점 @return listItems에 도달하면 listitems 배열이 null입니다.listitems가 ParseQuery에서 null을 반환합니다. (편집 됨)

나는 응답에서 몇 가지 예를 따르려고했지만, 알아낼 수는 없습니다. 콜백에서 객체를 가져 오지만, 결과를 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; 
} 

는 I 처리 들면 대해 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()로 변경하면 처리가 모두 완료되고 listitem이 설정되어 콜백에 추가되지만 이것이 내 어댑터에 어떤 영향을 미칩니 까? 그 메서드를 호출합니다. 다음은 어댑터의 호출입니다. 마지막 RecyclerAdapter adapter = 새 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; 
} 
관련 문제