使用recyclelerView和Parse在android中使用位图管理内存

时间:2015-03-27 03:46:04

标签: android parse-platform android-recyclerview

我有这个应用程序在recyclerView中加载一堆图像。首先,它只加载文本,然后在后台下载图像。在某些情况下,应用程序只会冻结并导致应用程序无响应。我在互联网上寻找像懒人加载等解决方案,但我仍然得到这个ANR。有什么建议吗?顺便说一下,我使用Parse.com作为我的服务器。

这是我的recyclerView适配器。它看起来非常可怕。

public class PostListAdapter extends RecyclerView.Adapter<PostListAdapter.PostViewHolder> {
    List<Post> postList;
    Context context;

    public PostListAdapter(List<Post> postList, Context context){
        this.postList = postList;
        this.context = context;
    }

    @Override
    public PostListAdapter.PostViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.
                from(viewGroup.getContext()).
                inflate(R.layout.post_card_layout, viewGroup, false);

        return new PostViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(final PostListAdapter.PostViewHolder postViewHolder, final int position) {
        postViewHolder.area.setText(postList.get(position).getArea());
        postViewHolder.userName.setText(postList.get(position).getUserName());
        postViewHolder.content.setText(postList.get(position).getContent());
        postViewHolder.vote.setText(String.format("%d", postList.get(position).getVotes()));
        postViewHolder.comment.setText(String.format("Comments: %d", postList.get(position).getComments()));

        if (postList.get(position).getUpVoteImage() != 0) {
            postViewHolder.upVote.setImageResource(postList.get(position).getUpVoteImage());
        } else {
            postViewHolder.upVote.setImageResource(R.drawable.upvote);
        }
        if (postList.get(position).getDownVoteImage() != 0) {
            postViewHolder.downVote.setImageResource(postList.get(position).getDownVoteImage());
        } else {
            postViewHolder.downVote.setImageResource(R.drawable.downvote);
        }

        ParseQuery<Vote> upVotes = ParseQuery.getQuery("Vote");
        upVotes.whereEqualTo("postId", postList.get(position).getObjectId());
        upVotes.whereEqualTo("userId", ParseUser.getCurrentUser().getObjectId());
        upVotes.whereEqualTo("voteType", "1");
        upVotes.countInBackground(new CountCallback() {
            @Override
            public void done(final int i, ParseException e) {
                if (e == null) {
                    ParseQuery<Vote> downVotes = ParseQuery.getQuery("Vote");
                    downVotes.whereEqualTo("postId", postList.get(position).getObjectId());
                    downVotes.whereEqualTo("userId", ParseUser.getCurrentUser().getObjectId());
                    downVotes.whereEqualTo("voteType", "0");
                    downVotes.countInBackground(new CountCallback() {
                        @Override
                        public void done(int j, ParseException e) {
                            if (e == null) {
                                postList.get(position).setVotes(i - j);
                                postViewHolder.vote.setText(String.format("%d", i - j));
                            }
                        }
                    });
                }
            }
        });

        ParseQuery<Comment> comments = ParseQuery.getQuery("Comment");
        comments.whereEqualTo("postId", postList.get(position).getObjectId());
//        comments.whereEqualTo("userId", ParseUser.getCurrentUser().getObjectId());
        comments.countInBackground(new CountCallback() {
            @Override
            public void done(int i, ParseException e) {
                if (e == null) {
                    postList.get(position).setComments(i);
                    postViewHolder.comment.setText(String.format("Comments: %d", postList.get(position).getComments()));
                }
            }
        });

        if (postList.get(position).getVoteType() == null) {
            postViewHolder.upVote.setClickable(false);
            postViewHolder.downVote.setClickable(false);
            ParseQuery<Vote> mainQuery = ParseQuery.getQuery("Vote");
            mainQuery.whereEqualTo("userId", ParseUser.getCurrentUser().getObjectId());
            mainQuery.whereEqualTo("postId", postList.get(position).getObjectId());
            mainQuery.findInBackground(new FindCallback<Vote>() {
                @Override
                public void done(List<Vote> vote, ParseException e) {
                    if (e != null) {
                        Msg.Toast(e.getMessage(), context);
                    } else {
                        if (vote.size() > 0) {
                            postList.get(position).setVoteType(vote.get(0).getVote());
                            postList.get(position).setVoteId(vote.get(0).getObjectId());
                            if (postList.get(position).getVoteType().equals("1")) {
                                postList.get(position).setUpVoteImage(R.drawable.upvoted);
                                postViewHolder.upVote.setImageResource(postList.get(position).getUpVoteImage());
                            } else {
                                postList.get(position).setDownVoteImage(R.drawable.downvoted);
                                postViewHolder.downVote.setImageResource(postList.get(position).getDownVoteImage());
                            }
                        }
                    }
                    postViewHolder.upVote.setClickable(true);
                    postViewHolder.downVote.setClickable(true);
                }
            });
        }
        if (postList.get(position).getHasPhoto()) {
            ViewGroup.LayoutParams params = postViewHolder.content.getLayoutParams();
            params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
            postViewHolder.content.setLayoutParams(params);
            postViewHolder.photoThumb.setVisibility(View.VISIBLE);
            postViewHolder.content.setBackgroundResource(Color.TRANSPARENT);
            if (postList.get(position).getPhoto() == null) {
                postViewHolder.photoThumb.setImageResource(R.drawable.blank);
                postList.get(position).fetchIfNeededInBackground(new GetCallback<Post>() {
                    @Override
                    public void done(Post photo, ParseException e) {
                        if (e == null) {
                            try {
                                postViewHolder.photoThumb.setVisibility(View.VISIBLE);
                                postList.get(position).setPhoto(photo.getPhoto());
                                postViewHolder.photoThumb.setImageBitmap(postList.get(position).getPhoto());
                            } catch (Exception e1){
                                e1.printStackTrace();
                            }
                        }
                    }
                });
            } else {
                postViewHolder.photoThumb.setImageBitmap(postList.get(position).getPhoto());
            }
        } else {
            ViewGroup.LayoutParams params = postViewHolder.content.getLayoutParams();
            params.height = 400;
            postViewHolder.content.setLayoutParams(params);
            postViewHolder.content.setText(postList.get(position).getContent());
            postViewHolder.photoThumb.setImageBitmap(null);
            postViewHolder.photoThumb.setVisibility(View.GONE);
        }

        postViewHolder.upVote.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                upvotePost(postViewHolder, position);
            }
        });
        postViewHolder.downVote.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                downvotePost(postViewHolder, position);
            }
        });

        postViewHolder.comment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(context, ViewCommentActivity.class);
                i.putExtra("author", postList.get(position).getUserName());
                i.putExtra("authorId", postList.get(position).getUserId());
                i.putExtra("content", postList.get(position).getContent());
                i.putExtra("postId", postList.get(position).getObjectId());
                if (postList.get(position).getHasPhoto()) {
                    i.putExtra("photo", postList.get(position).getPhoto());
                }
                context.startActivity(i);
            }
        });
    }

    @Override
    public int getItemCount() {
        return postList.size();
    }

    public static class PostViewHolder extends RecyclerView.ViewHolder {

        protected TextView area;

        protected TextView userName;
        protected TextView content;
        protected TextView vote;
        protected TextView comment;
        protected ImageView photoThumb, upVote, downVote;
        public PostViewHolder(View v) {
            super(v);
            area = (TextView) v.findViewById(R.id.tvArea);
            userName = (TextView) v.findViewById(R.id.tvUserName);
            content = (TextView) v.findViewById(R.id.tvContent);
            vote = (TextView) v.findViewById(R.id.tvLike);
            comment = (TextView) v.findViewById(R.id.tvComment);
            photoThumb = (ImageView) v.findViewById(R.id.ivPhoto);
            upVote = (ImageView) v.findViewById(R.id.ivUpVote);
            downVote = (ImageView) v.findViewById(R.id.ivDownVote);
        }

    }

    private void downvotePost(final PostViewHolder postViewHolder, final int position) {
        postViewHolder.upVote.setClickable(false);
        postViewHolder.downVote.setClickable(false);
        if (postList.get(position).getVoteType() != null) {
            if (postList.get(position).getVoteType().equals("0")) {
                ParseQuery<Vote> query = ParseQuery.getQuery("Vote");
                query.getInBackground(postList.get(position).getVoteId(), new GetCallback<Vote>() {
                    public void done(Vote vote, ParseException e) {
                        if (e == null) {
                            vote.deleteInBackground(new DeleteCallback() {
                                @Override
                                public void done(ParseException e) {
                                    if (e == null) {
                                        int newVote = postList.get(position).getVotes() + 1;
                                        postList.get(position).setVotes(newVote);
                                        postViewHolder.vote.setText(String.format("%d", newVote));
                                        postList.get(position).setDownVoteImage(R.drawable.downvote);
                                        postViewHolder.downVote.setImageResource(postList.get(position).getDownVoteImage());
                                        postList.get(position).setVoteType(null);
                                    } else {
                                        Msg.Toast(e.getMessage(), context);
                                    }
                                    postViewHolder.upVote.setClickable(true);
                                    postViewHolder.downVote.setClickable(true);
                                }
                            });
                        } else {
                            Msg.Toast(e.getMessage(), context);
                            postViewHolder.upVote.setClickable(true);
                            postViewHolder.downVote.setClickable(true);
                        }
                    }
                });
            } else {
                ParseQuery<Vote> query = ParseQuery.getQuery("Vote");
                query.getInBackground(postList.get(position).getVoteId(), new GetCallback<Vote>() {
                    public void done(Vote vote, ParseException e) {
                        if (e == null) {
                            vote.setVote("0");
                            vote.saveInBackground(new SaveCallback() {
                                @Override
                                public void done(ParseException e) {
                                    if (e == null) {
                                        int newVote = postList.get(position).getVotes() - 2;
                                        postList.get(position).setVotes(newVote);
                                        postList.get(position).setVoteType("0");
                                        postList.get(position).setUpVoteImage(R.drawable.upvote);
                                        postList.get(position).setDownVoteImage(R.drawable.downvoted);
                                        postViewHolder.vote.setText(String.format("%d", newVote));

                                        postViewHolder.downVote.setImageResource(postList.get(position).getDownVoteImage());
                                        postViewHolder.upVote.setImageResource(postList.get(position).getUpVoteImage());
                                    } else {
                                        Msg.Toast(e.getMessage(), context);
                                    }
                                    postViewHolder.upVote.setClickable(true);
                                    postViewHolder.downVote.setClickable(true);
                                }
                            });
                        } else {
                            Msg.Toast(e.getMessage(), context);
                            postViewHolder.upVote.setClickable(true);
                            postViewHolder.downVote.setClickable(true);
                        }
                    }
                });
            }
        } else {
            final Vote vote = new Vote();
            vote.setPostId(postList.get(position).getObjectId());
            vote.setUserId(ParseUser.getCurrentUser().getObjectId());
            vote.setVote("0");
            vote.saveInBackground(new SaveCallback() {
                @Override
                public void done(ParseException e) {
                    if (e == null) {
                        ParseQuery<Post> query = ParseQuery.getQuery("Post");
                        query.getInBackground(postList.get(position).getObjectId(), new GetCallback<Post>() {
                            public void done(Post updatePost, ParseException e) {
                                if (e == null) {
                                    int newVote = postList.get(position).getVotes() - 1;
                                    postList.get(position).setVotes(newVote);
                                    postList.get(position).setVoteId(vote.getObjectId());
                                    postList.get(position).setVoteType("0");
                                    postList.get(position).setUpVoteImage(R.drawable.upvote);
                                    postList.get(position).setDownVoteImage(R.drawable.downvoted);
                                    postViewHolder.vote.setText(String.format("%d", newVote));
                                    postViewHolder.downVote.setImageResource(postList.get(position).getDownVoteImage());
                                    postViewHolder.upVote.setImageResource(postList.get(position).getUpVoteImage());
                                } else {
                                    postList.get(position).setDownVoteImage(R.drawable.downvoted);
                                    postViewHolder.downVote.setImageResource(postList.get(position).getDownVoteImage());
                                    Msg.Toast(e.getMessage(), context);
                                }
                                postViewHolder.upVote.setClickable(true);
                                postViewHolder.downVote.setClickable(true);
                            }
                        });
                    } else {
                        Msg.Toast(e.getMessage(), context);
                    }
                    postViewHolder.upVote.setClickable(true);
                    postViewHolder.downVote.setClickable(true);
                }
            });

        }
    }

    private void upvotePost(final PostViewHolder postViewHolder, final int position) {
        postViewHolder.upVote.setClickable(false);
        postViewHolder.downVote.setClickable(false);
        if (postList.get(position).getVoteType() != null) {
            if (postList.get(position).getVoteType().equals("1")) {
                ParseQuery<Vote> query = ParseQuery.getQuery("Vote");
                query.getInBackground(postList.get(position).getVoteId(), new GetCallback<Vote>() {
                    public void done(Vote vote, ParseException e) {
                        if (e == null) {
                            vote.deleteInBackground(new DeleteCallback() {
                                @Override
                                public void done(ParseException e) {
                                    if (e == null) {
                                        int newVote = postList.get(position).getVotes() - 1;
                                        postList.get(position).setVotes(newVote);
                                        postViewHolder.vote.setText(String.format("%d", newVote));
                                        postViewHolder.upVote.setImageResource(R.drawable.upvote);
                                        postList.get(position).setVoteType(null);
                                    } else {
                                        Msg.Toast(e.getMessage(), context);
                                    }
                                    postViewHolder.upVote.setClickable(true);
                                    postViewHolder.downVote.setClickable(true);
                                }
                            });
                        } else {
                            postViewHolder.upVote.setClickable(true);
                            postViewHolder.downVote.setClickable(true);
                            Msg.Toast(e.getMessage(), context);
                        }
                    }
                });
            } else {
                ParseQuery<Vote> query = ParseQuery.getQuery("Vote");
                query.getInBackground(postList.get(position).getVoteId(), new GetCallback<Vote>() {
                    public void done(Vote vote, ParseException e) {
                        if (e == null) {
                            vote.setVote("1");
                            vote.saveInBackground(new SaveCallback() {
                                @Override
                                public void done(ParseException e) {
                                    if (e == null) {
                                        int newVote = postList.get(position).getVotes() + 2;
                                        postList.get(position).setVotes(newVote);
                                        postList.get(position).setVoteType("1");
                                        postList.get(position).setUpVoteImage(R.drawable.upvoted);
                                        postList.get(position).setDownVoteImage(R.drawable.downvote);
                                        postViewHolder.vote.setText(String.format("%d", newVote));
                                        postViewHolder.upVote.setImageResource(postList.get(position).getUpVoteImage());
                                        postViewHolder.downVote.setImageResource(postList.get(position).getDownVoteImage());
                                    } else {
                                        Msg.Toast(e.getMessage(), context);
                                    }
                                    postViewHolder.upVote.setClickable(true);
                                    postViewHolder.downVote.setClickable(true);
                                }
                            });
                        } else {
                            postViewHolder.upVote.setClickable(true);
                            postViewHolder.downVote.setClickable(true);
                            Msg.Toast(e.getMessage(), context);
                        }
                    }
                });
            }
        } else {
            final Vote vote = new Vote();
            vote.setPostId(postList.get(position).getObjectId());
            vote.setUserId(ParseUser.getCurrentUser().getObjectId());
            vote.setVote("1");
            vote.saveInBackground(new SaveCallback() {
                @Override
                public void done(ParseException e) {
                    if (e == null) {
                        ParseQuery<Post> query = ParseQuery.getQuery("Post");
                        query.getInBackground(postList.get(position).getObjectId(), new GetCallback<Post>() {
                            public void done(Post updatePost, ParseException e) {
                                if (e == null) {
                                    int newVote = postList.get(position).getVotes() + 1;
                                    postList.get(position).setVotes(newVote);
                                    postList.get(position).setVoteId(vote.getObjectId());
                                    postList.get(position).setVoteType("1");
                                    postList.get(position).setUpVoteImage(R.drawable.upvoted);
                                    postList.get(position).setDownVoteImage(R.drawable.downvote);
                                    postViewHolder.vote.setText(String.format("%d", newVote));
                                    postViewHolder.upVote.setImageResource(postList.get(position).getUpVoteImage());
                                    postViewHolder.downVote.setImageResource(postList.get(position).getDownVoteImage());
                                } else {
                                    postViewHolder.upVote.setImageResource(R.drawable.upvoted);
                                    Msg.Toast(e.getMessage(), context);
                                }
                                postViewHolder.upVote.setClickable(true);
                                postViewHolder.downVote.setClickable(true);
                            }
                        });
                    } else {
                        postViewHolder.upVote.setClickable(true);
                        postViewHolder.downVote.setClickable(true);
                        Msg.Toast(e.getMessage(), context);
                    }
                }
            });

        }
    }
}

0 个答案:

没有答案