이 스 니펫 코드에서는 조건을 기반으로 개체를 검색하기 위해 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;
}
처럼 변경? –
@Abhijith 더 자세히 설명해 주시겠습니까? 목록을 반환하는 대신 메서드 서명을 public void getListItems()로 변경하면 처리가 모두 완료되고 listitem이 설정되어 콜백에 추가되지만 이것이 내 어댑터에 어떤 영향을 미칩니 까? 그 메서드를 호출합니다. 다음은 어댑터의 호출입니다. 마지막 RecyclerAdapter adapter = 새 RecyclerAdapter (getHeader(), getListItems()); –
추가 코드를 추가하기 위해 질문을 편집 할 수 있습니까? –