2

データバインディングを介してfirebaseリサイクラーアダプターを使用してfirebaseデータにデータを入力しています.Picassoまたは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());
                }
            });
        }
    };
}

レイアウトで使用される ImageView に画像をロードする ViewHolder:

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 に答える