我有这个应用程序在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);
}
}
});
}
}
}