ListView 适配器 returns 仅 Parse.com 对象的最后一行 - Android

ListView adapter returns only the last row of Parse.com object - Android

我正在使用 AsyncTask 查询 Parse.com 中名为 Shop_comments 的对象。在查询结果中,我得到了用户名,它是指向 _User 对象的指针,我从该用户那里检索信息。用户的所有信息和评论,我把它们放在结果中,结果是 SetCommentsResultsConditions class 的对象,它通过其他函数从查询和 returns 中门控数据,在另一个片段 activity.


这是我的 AsyncTask:

    private class ViewDataTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //startLoading();

            proDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            // Create the array
            searchlist = new ArrayList<SetCommentsResultsConditions>();

            //use it to find the shop object id
            final ParseObject shop_id = ParseObject.createWithoutData("Shop", shopname);
//            Log.d("SHOP ID ", shopname);

            try {
                final ParseQuery comment = new ParseQuery("Shop_comments");
                comment.whereEqualTo("name", shop_id);
                comment.include("username");

                comment.orderByDescending("createdAt");

                final SetCommentsResultsConditions result = new SetCommentsResultsConditions();

                ob = comment.find();

                if (ob.size() == 0) {
                    flag_show = false;
                } else {
                    flag_show = true;
                }

                if (flag_show) {
                    for (ParseObject shop : ob) {
                        ParseUser user = shop.getParseUser("username");
                        String username = user.getUsername();

                        Log.d("USER", username);
                        Log.d("COMMENT", String.valueOf(shop.getString("comment")));
                        Log.d("REWARD RATING", String.valueOf(user.getInt("reward_rating")));

                        result.setUserName(String.valueOf(username));
                        result.setApprovedFlag(shop.getBoolean("label_approved"));
                        result.setComment(String.valueOf(shop.getString("comment")));
                        result.setDate(shop.getUpdatedAt());

                        if (user.getParseFile("photo") != null) {
                            ParseFile image = (ParseFile) user.get("photo");

                            if (image.getUrl() != null)
                                result.setImage(image.getUrl()); //send photo
                        }

                        result.setReward_rating(String.valueOf(user.getInt("reward_rating")));
                        result.setReward_shop(String.valueOf(user.getInt("reward_shop")));
                        result.setGender(user.getString("gender"));

                        searchlist.add(result);

                        Log.d("GET COMMENT", result.getComment());
                    }
                }
            } catch (com.parse.ParseException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            proDialog.hide();
            //stopLoading();

            if (flag_show) {
//                Toast.makeText(getActivity().getApplicationContext(), "There are comments for this shop!", Toast.LENGTH_LONG).show();

                // Locate the listview in listview_main.xml
                listview = (ListView) convertView.findViewById(R.id.comments);

                // Pass the results into ListViewAdapter.java
                adapter = new ListViewAdapter_ViewComments(getActivity().getApplicationContext(), searchlist);

                // Binds the Adapter to the ListView
                listview.setAdapter(adapter);
            }
            else{
                Toast.makeText(getActivity().getApplicationContext(), "We couldn't find any valid comments!", Toast.LENGTH_LONG).show();

                Intent intent;
                intent = new Intent(getActivity().getApplicationContext(), BaseActivity.class);

                intent.putExtra("flag_failviewcomment", "Y");

                intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

                getActivity().overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out);

                startActivity(intent);
            }
        }
    }

这是 SetResuktsConditions class,我在其中发送来自查询的数据:

public class SetCommentsResultsConditions {
    private String image;
    private String reward_shop;
    private String reward_rating;
    private String username;
    private String comment;
    private Date date;
    private String gender;
    private boolean flag_approved;

    public String getUserName() {
        return username;
    }
    public void setUserName(String username) {
        this.username = username;
    }

    public String getComment() {
        return comment;
    }
    public void setComment(String comment) {
        this.comment = comment;
    }

    public String getReward_shop() {
        return reward_shop;
    }
    public void setReward_shop(String reward_shop) {
        this.reward_shop = reward_shop;
    }

    public String getReward_rating() {
        return reward_rating;
    }
    public void setReward_rating(String reward_rating) {
        this.reward_rating = reward_rating;
    }

    public boolean getApprovedFlag(){ return flag_approved;}
    public void setApprovedFlag(Boolean flag_approved) {
        this.flag_approved = flag_approved;
    }

    public Date getDate(){ return date;}
    public void setDate(Date date) {
        this.date = date;
    }

    public String getImage() {
        return image;
    }
    public void setImage(String image) {
        this.image = image;
    }

    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}

这是我的 ListViewAdapter_ViewComments class:

public class ListViewAdapter_ViewComments extends BaseAdapter {

    // Declare Variables
    Context context;
    LayoutInflater inflater;
    ImageLoader_Comments imageLoader;

    private List<SetCommentsResultsConditions> searchlist = null;
    private ArrayList<SetCommentsResultsConditions> arraylist;

    public ListViewAdapter_ViewComments(Context context, List<SetCommentsResultsConditions> searchlist) {
        this.context = context;
        this.searchlist = searchlist;
        inflater = LayoutInflater.from(context);
        this.arraylist = new ArrayList<SetCommentsResultsConditions>();
        this.arraylist.addAll(searchlist);
        imageLoader = new ImageLoader_Comments(context);
    }

    public class ViewHolder {
        TextView username;
        TextView date;
        TextView reward_rate;
        TextView reward_addshop;
        ImageView trustorno;
        TextView trustornotext;
        TextView comment;

        com.github.siyamed.shapeimageview.CircularImageView user;
    }

    @Override
    public int getCount() {
        return searchlist.size();
    }

    @Override
    public Object getItem(int position) {
        return searchlist.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public View getView(final int position, View view, ViewGroup parent) {
        final ViewHolder holder;

        if (view == null) {
            holder = new ViewHolder();
            view = inflater.inflate(R.layout.listview_item_view_comments, null);

            // Locate the TextViews in listview_item.xml
            holder.username = (TextView) view.findViewById(R.id.username);
            holder.date = (TextView) view.findViewById(R.id.date);
            holder.reward_rate = (TextView) view.findViewById(R.id.reward_rate);
            holder.reward_addshop = (TextView) view.findViewById(R.id.reward_addshop);
            holder.trustorno = (ImageView) view.findViewById(R.id.trustorno);
            holder.trustornotext = (TextView) view.findViewById(R.id.trustornotext);
            holder.comment = (TextView) view.findViewById(R.id.comment);

            // Locate the ImageView in listview_item.xml
            holder.user = (com.github.siyamed.shapeimageview.CircularImageView) view.findViewById(R.id.user);
            view.setTag(holder);
        }
        else {
            holder = (ViewHolder) view.getTag();
        }

        int counter = getCount();

        if (counter == 0) {
            Toast.makeText(ListViewAdapter_ViewComments.this.context, "", Toast.LENGTH_LONG).show();
        } else {
//            Log.d("username", String.valueOf(searchlist.get(position).getUserName()));
//            Log.d("date", String.valueOf(searchlist.get(position).getDate()));

            SimpleDateFormat dayFormat = new SimpleDateFormat("dd");
            String day = dayFormat.format((searchlist.get(position).getDate()));
//            Log.d("day", day);

            SimpleDateFormat monthFormat = new SimpleDateFormat("MM");
            String month = monthFormat.format((searchlist.get(position).getDate()));
//            Log.d("month", month);

            SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");
            String year = yearFormat.format((searchlist.get(position).getDate()));
//            Log.d("year", year);

            SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
            String time = timeFormat.format((searchlist.get(position).getDate()));
//            Log.d("time", time);

            // Set the results into TextViews
            holder.username.setText(String.valueOf(searchlist.get(position).getUserName()));
            holder.date.setText(day + "/" + month + "/" + year + " - " + time);
            holder.reward_rate.setText(String.valueOf(searchlist.get(position).getReward_rating()));
            holder.reward_addshop.setText(String.valueOf(searchlist.get(position).getReward_shop()));
            holder.comment.setText(String.valueOf(searchlist.get(position).getComment()));

            if (searchlist.get(position).getApprovedFlag() == true){
                holder.trustorno.setImageResource(R.drawable.approved);
                holder.trustornotext.setText("Verified comment!");
            }
            else{
                holder.trustorno.setImageResource(R.drawable.nonapproved);
                holder.trustornotext.setText("Unverified comment!");
            }

            // Set the results into ImageView
            if (searchlist.get(position).getImage() != null) {
                imageLoader.DisplayImage(searchlist.get(position).getImage(), holder.user);
            }
            else{
                if (searchlist.get(position).getGender().equals("Female")){
                    imageLoader.DisplayImage(String.valueOf(R.drawable.female), holder.user);
                }
                else if (searchlist.get(position).getGender().equals("Male")){
                    imageLoader.DisplayImage(String.valueOf(R.drawable.male), holder.user);
                }
            }

            ParseQuery.clearAllCachedResults();
        }

在执行我的程序时,从 AsyncTask 中,我可以从 Logcat 看到在 AsyncTask 内部,我发送到 results 的值在每个 for 中都是不同的。

03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/USER﹕ michael
03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/COMMENT﹕ helloo9i
03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/REWARD RATING﹕ 0
03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/GET COMMENT﹕ helloo9i
03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/USER﹕ marialena
03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/COMMENT﹕ hello there
03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/REWARD RATING﹕ 0
03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/GET COMMENT﹕ hello there
03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/USER﹕ marialena
03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/COMMENT﹕ dkoc
03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/REWARD RATING﹕ 0
03-29 18:05:48.406  10219-10571/guide_me_for_all.guide_me_for_all D/GET COMMENT﹕ dkoc

我在 Parse.com 中的评论中的一张照片证明了这一点:


我最后看到的评论是三个相同的评论,代表Parse.com

中的最后一行/最后一条评论


那么如何显示来自 Parse.com 的所有评论?

在你的 AsyncTask 中,你做了:

result.setUserName(String.valueOf(username));
result.setApprovedFlag(shop.getBoolean("label_approved"));                                 
etc...

然后

searchlist.add(result);

但是,您 result 在循环外实例化了。您正在修改同一实例对象的值并将其插入列表中。实际上,您每次都将相同的对象插入到您的列表中,但只是在遍历 Parse 数据时使用 for 循环中的值修改该对象。

您需要做的是在您的 for 循环内部而不是外部实例化一个新对象。

示例:

for (ParseObject shop : ob) {
    final SetCommentsResultsConditions result = new SetCommentsResultsConditions();
    ...

}