FirebaseUI RecyclerView随机项添加到列表项

时间:2016-04-30 16:28:15

标签: android firebase

按下按钮时,会出现一个对话框,询问用户是否有消息,并可选择附加图像(来自网址)。我遇到的问题是,一旦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

1 个答案:

答案 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); 
    }
}