2

我正在通过数据绑定使用 firebase 回收器适配器填充 firebase 数据,并希望使用来自 Picasso 或 Glide 的数据填充图像,但无法做到。所以任何人都可以帮助我写什么以及在哪里写毕加索或 Glide 的代码。

public class ShopByCategoryFragment extends Fragment {

FirebaseRecyclerAdapter adapter;
Firebase mFirebaseRef = new Firebase("https://abc.firebaseio.com/").child("subCategories");

public ShopByCategoryFragment() {
    // Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.recycler_view, container, false);
    final RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
    adapter = new FirebaseRecyclerAdapter<SubCategories, ViewHolder>(SubCategories.class, R.layout.fragment_shop_by_category,
            ViewHolder.class, mFirebaseRef) {
        @Override
        protected void populateViewHolder(ViewHolder viewHolder, SubCategories subCategories, int i) {


            FragmentShopByCategoryBinding binding = viewHolder.getBinding();
            binding.setSubCategories(subCategories);
        }
    };
    recyclerView.setAdapter(adapter);

    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2));
    return rootView;
}

public static class ViewHolder extends RecyclerView.ViewHolder {

    public FragmentShopByCategoryBinding binding;

    public ViewHolder(View itemView) {
        super(itemView);
        binding = DataBindingUtil.bind(itemView);
    }
    public FragmentShopByCategoryBinding getBinding() {
        return binding;
    }
}
@Override
public void onDestroy() {
    super.onDestroy();
    adapter.cleanup();
}

}

<layout xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
    <variable
        name="SubCategories"
        type="com.abc.www.shopping.model.SubCategories"/>
</data>

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="@dimen/tile_height"
            android:id="@+id/sub_category_image"
            android:scaleType="centerCrop"
            android:src="@{SubCategories.image}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="@dimen/tile_height"
            android:text="@{SubCategories.title}"
            android:id="@+id/sub_category_title"
            android:padding="16dp"
            android:textColor="@color/colorSubCategoryTitle"
            android:layout_gravity="center"
            android:textAppearance="@android:style/TextAppearance.Material.Title"
            tools:targetApi="lollipop" />
    </FrameLayout>
</android.support.v7.widget.CardView>

public class SubCategories extends BaseObservable {

private String title;
private String image;

public SubCategories() {
    // empty constructor
}

public SubCategories(String title, String image) {
    this.title = title;
    this.image = image;

}

public String getTitle() {
    return title;
}

public String getImage() {
    return image;
}

}

4

2 回答 2

1

我做了一些类似于你需要的东西。我将分享我的代码并做一些解释。

我有一个返回 FirebaseRecyclerAdapter 的类,如下所示:

public RecyclerView.Adapter postAdapter(String userKey, final Context context, MyClickListener clickListener) {
    Query userPostRef = postRef.child(userKey);
    myClickListener = clickListener;

    return new FirebaseRecyclerAdapter<PostModel, DataObjectHolder>(PostModel.class, R.layout.stream_layout, DataObjectHolder.class, userPostRef) {
        @Override
        public void populateViewHolder(final DataObjectHolder dataviewHolder, final PostModel postModel, int position) {
            StorageReference mStorageRef = FirebaseStorage.getInstance().getReference();
            mStorageRef.child("uploaded_captures/" + postModel.getImageFilename() + ".jpg").getDownloadUrl()
                    .addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            dataviewHolder.setImage(uri.toString(), context);
                            dataviewHolder.setComment(postModel.getPostComment());
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    Log.e("FirebaseRecyclerAdapter", exception.getMessage());
                }
            });
        }
    };
}

和一个 ViewHolder 将图像加载到布局使用的 ImageView 中:

private static class DataObjectHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    View mView;

    public DataObjectHolder(View itemView) {
        super(itemView);
        mView = itemView;
    }

    void setImage(final String imageURL, final Context context) {
        final ImageView postImage = (ImageView) mView.findViewById(R.id.imageView);
        if (BuildConfig.DEBUG) {
            Picasso.with(context).setIndicatorsEnabled(true);
        }
        Picasso.with(context)
                .load(imageURL)
                .networkPolicy(NetworkPolicy.OFFLINE)
                .placeholder(R.drawable.ic_menu_camera)
                .fit().centerCrop().into(postImage, new Callback() {
            @Override
            public void onSuccess() {
            }

            @Override
            public void onError() {
                Picasso.with(context)
                        .load(imageURL)
                        .placeholder(R.drawable.ic_menu_camera)
                        .fit().centerCrop().into(postImage);
            }
        });
    }

    void setComment(String text) {
        TextView comment = (TextView) mView.findViewById(R.id.comment);
        comment.setText(text);
    }

    @Override
    public void onClick(View v) {
        myClickListener.onItemClick(getAdapterPosition(), v);
    }
}

在 Picasso 上,我使用 NerworkPolicy.OFFLINE 在尝试从网络获取图像之前检查图像是否在磁盘缓存中。这并不完美,一旦 ViewHolder 被回收,我仍然对图像延迟有一些问题,但我认为这是你继续下去的开始。

于 2016-07-25T00:18:39.687 回答
0

在我的 ViewHolder 中,我通过以下方式执行此操作:

Glide.with(context)
     .load(chat.getImageUrl())
     .into(imageView);

我还没有尝试过为此使用数据绑定,但代码很简单。

于 2016-04-15T13:30:59.220 回答