按下按钮时,会出现一个对话框,询问用户是否有消息,并可选择附加图像(来自网址)。我遇到的问题是,一旦recyclerview被填充了足够的项目进行滚动,当用户因某种原因快速滚动时,随机图像会在看似随机的列表项中弹出。
我知道问题必须来自实际放入imageview的图像,因为我可以告诉链接被添加到firebase数据库中就好了。
提交图片链接后,会将其发送到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。
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,问题仍然存在。 SOS答案 0 :(得分:1)
我必须做的就是在填充ImageView之前将ImageView drawable设置为null。
像这样:
@Override
protected void populateViewHolder(final ViewHolder v, final Object o, int i) {
//populate views
v.content.setText("...");
//Set imageview to null
v.imageview.setImageDrawable(null);*
if (o.getImageLink() != null && !o.getImageLink.equals("")) {
// Start AsyncTask to get image from link and populate imageview
new DownloadImageTask().execute(o.getImgLink(), v.imageview);
}
}