【发布时间】:2016-04-30 16:28:14
【问题描述】:
当按下按钮时,会出现一个对话框,询问用户信息,并可选择附加图像(来自 url)。我遇到的问题是,一旦 recyclerview 充满了足够的项目以滚动,当用户由于某种原因快速滚动时,随机图像开始在看似随机的列表项中弹出。
我知道问题出在实际将图像放入 imageview 时,因为我可以告诉链接已添加到 firebase db 就好了。
当图片链接被提交时,它被发送到一个HashMap中的/posts/$uid/$post-id。有点像这样:
final Map<String, String> postMap = new HashMap<String, String>();
imagebutton.setOnClickListener((view) -> {
AlertDialog.Builder = new...
LayoutInflater in = ...
View dialogLayout = ...inflate(r.layout...., null);
build.setView(dialogLayout);
EditText imgText = ...
Button submit = ...
AlertDialog a = build.create();
submit.setOnClickListener((View) -> {
...
postMap.put("imgLink", imgText.getText().toString());
a.dismiss();
...
urlDialog.show();
然后将更多项目添加到地图并推送到火力基地。
Firebase postRef = ref.child("posts").child(auth.getUid());
postMap.put("author", ...);
postMap.put("content", ...);
postRef.push().setValue(postMap);
但就像我说的,我几乎 100% 确定问题不在于发布信息,而只是填充了recview
这是我的列表本身的代码:
RecyclerView feed = (RecyclerView)findViewById(R.id.recycler);
if (ref.getAuth() != null) {
FirebaseRecyclerAdapter<TextPost, PostViewHolder> adapter = new FirebaseRecyclerAdapter<TextPost, PostViewHolder>(TextPost.class, R.layout.list_item, PostViewHolder.class, ref.child("posts").child(uid)) {
@Override
protected void populateViewHolder(final PostViewHolder postViewHolder, final TextPost textPost, int i) {
postViewHolder.content.setText(textPost.getContent());
postViewHolder.author.setText(textPost.getAuthor());
postViewHolder.score.setText(textPost.getScore());
postViewHolder.time.setText(textPost.getTime());
if (textPost.getImgLink() != null && !textPost.getImgLink().equals("")) {
Log.i(TAG, "Setting image");
new Thread(new Runnable() {
@Override
public void run() {
try {
final Bitmap pic = bitmapFromUrl(textPost.getImgLink());
postViewHolder.img.post(new Runnable() {
@Override
public void run() {
postViewHolder.img.setImageBitmap(pic);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
...
feed.setAdapter(adapter);
我刚开始学习如何在主 UI 线程之外使用工作线程进行网络活动,所以我认为我搞砸了?我在脑海中一遍又一遍地思考逻辑,我似乎无法弄清楚这里出了什么问题。
编辑:我尝试使用 AsyncTask 而不是 Threads,但问题仍然存在。嗬嗬
【问题讨论】:
-
我自己没见过这个,但我希望当 RecyclerView 已经回收了 ViewHolder 时,你的位图数据会回来。如果这确实是原因,请参阅stackoverflow.com/questions/23432372/…、stackoverflow.com/questions/26525999/… 以及此列表中的更多内容:google.com/…
-
谢谢,成功的人!只需在分配之前将 ImageView 设置为 null。
-
Goog 听到。我实际上不知道哪一个会解决它。感谢您的确认和自我回答。