【问题标题】:listitems is returning null, from a ParseQuery (Edited)listitems 从 ParseQuery 返回 null(已编辑)
【发布时间】:2017-02-15 19:34:21
【问题描述】:

在这段代码的 sn-p 中,我创建了一个 ParseQuery 来根据条件检索对象。当我在 for 块的开头放置一个断点时,在 done 方法中,我可以看到它拥有的对象的数量,我想要检索,当我逐步执行时,每个项目都被添加到 listItems 数组中,但是当我遇到最后一个断点时,@return listItems listitems 数组为空。

我尝试从 SO 的响应中遵循一些示例,但似乎无法弄清楚。在回调中它获取对象,但我不知道如何将结果分配给 listitems 对象。

谁能告诉我我在这里做错了什么,我将我的问题追溯到这个代码的 sn-p。

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

在我的 Fragment 类中,我实例化了一个新的 RecyclerView,它从 getHeader() 和 getListItems() 方法中获取返回值,并将这些值传递给我的 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(),处理全部完成,listitems 设置并添加到回调中,但这将如何影响我调用该方法的适配器。这里是来自适配器的调用,final RecyclerAdapter adapter = new RecyclerAdapter(getHeader(), getListItems());
  • 您可以编辑问题以添加其他代码吗?
  • @Abhijith,代码已被编辑以包含其他类

标签: java android arrays parse-platform


【解决方案1】:

我想出了如何返回列表,感谢所有试图帮助我的人的帮助,但是对于我的解决方案,下面的代码让我的项目正常工作。

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

【讨论】:

    猜你喜欢
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多