使用FirebaseRecyclerAdapter从数据库引用firebase存储以加载映像

时间:2017-08-25 14:50:28

标签: android firebase-realtime-database firebase-storage recycler-adapter firebaseui

我正在尝试复制messageTxt.setText(downloadUrl.toString());代码行Link here: (one of I/O 2016 demo)。它为EditText小部件提供了与存储在firebase存储中的图像相关联的URL,并将其加载为图像。 Live demo,请在28:37播放。

对于我的情况,我打算使用firebaseui的FirebaseRecyclerAdapter将图像和其他数据(如图像描述)加载到recyclerview上。我已经将数据保存到firebase数据库中,如下图所示。如您所见,其中一个值是image_path,它将URL保存到firebase存储中的相应图像。我使用taskSnapshot.getDownloadUrl();来获取图片网址。

但是,当我尝试使用此代码将此图像URL加载到TextView时,

public void setImage_path(String image) {
            feed_image = mView.findViewById(R.id.feed_image);
            feed_image.setText(image);
        }

仅显示文字,我希望图像显示的位置显示为空白。我该如何解决这个问题?提前致谢!我如何实现它的完整代码如下。如果需要任何其他代码,请告诉我,例如我的模型类。

代码:

Feed Fragment

public class Feed extends Fragment {

    private Button upload;
    private String businessID;
    private RecyclerView rv;
    private DatabaseReference mDatabase;
    private static StorageReference mStorage;

    private FirebaseRecyclerAdapter<ImageInformation, ImageHolder> mFirebaseAdapter;

    public Feed() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        mStorage = FirebaseStorage.getInstance().getReference("feed_photos");
       ...
    }

    @Override
    public void onStart() {
        super.onStart();

        mFirebaseAdapter = new FirebaseRecyclerAdapter<ImageInformation, ImageHolder>(
                ImageInformation.class,
                R.layout.card_item_feed,
                ImageHolder.class,
                mDatabase) {

            @Override
            public void populateViewHolder(ImageHolder holder, ImageInformation chat, int position) {
                Glide.with(Feed.this).load(chat.getImage_path()).into(holder.feed_image);
            holder.image_desc.setText(chat.getCaption());
            holder.date.setText(chat.getDate_created());
            holder.tag.setText(chat.getTags());
            }
        };
        rv.setAdapter(mFirebaseAdapter);
    }

    public static class ImageHolder extends RecyclerView.ViewHolder{

    ImageView feed_image;
    TextView image_desc;
    TextView date;
    TextView tag;

    public ImageHolder(View v) {
        super(v);
        feed_image = v.findViewById(R.id.feed_image);
        image_desc = v.findViewById(R.id.image_desc);

        date = v.findViewById(R.id.date);
        tag = v.findViewById(R.id.tags);
    }
}
}

Cardview XML

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="-3dp"
    android:layout_marginRight="-3dp"
    card_view:cardBackgroundColor="@android:color/white"
    card_view:cardCornerRadius="0dp"
    card_view:cardUseCompatPadding="false"
    card_view:contentPadding="0dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:id="@+id/linear_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <ImageView
            android:id="@+id/feed_image"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="0dp"
            android:adjustViewBounds="true"
            android:visibility="visible" />

        </LinearLayout>

        <TextView
            android:id="@+id/image_desc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/linear_layout"/>

        <TextView
            android:id="@+id/date"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/linear_layout"/>

        <TextView
            android:id="@+id/tags"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/linear_layout"/>

    </RelativeLayout>

</android.support.v7.widget.CardView>

编辑:我意识到我错过了我的firebase存储参考。我添加了它,但仍然卡住,因为我找不到如何检索Uri(selectedImageUri表示演示中的uri变量)。 (参见Feed Fragment中的评论)

编辑2: - 更改了ImageHolder类 - populateViewHolder方法中更新的内容 - 更新的cardview小部件

1 个答案:

答案 0 :(得分:0)

首先你应该

compile 'com.squareup.picasso:picasso:2.5.2'

图书馆以任何你想要的方式从firebase获取图像。

@Override
            public void populateViewHolder(ImageHolder holder, ImageInformation chat, int position) {
                //holder.setImage_path(chat.getImage_path());
                 Picasso.with(this).load(chat.getImage_path()).into(holder.feed_image);
                 holder.title.setText(chat.getCaption());
               // holder.setCaption(chat.getCaption());
            }
        };

有关详细信息,请点击链接Here查看示例