【问题标题】:FirebaseUI RecyclerView random items added to listitemsFirebaseUI RecyclerView 添加到列表项的随机项目
【发布时间】: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,但问题仍然存在。嗬嗬

【问题讨论】:

标签: android firebase


【解决方案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); 
    }
}

【讨论】:

    猜你喜欢
    • 2017-09-20
    • 2012-05-22
    • 2021-09-30
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多