1

Ich bevölkere eine Firebase-Daten mit Firebase Recycler-Adapter durch Datenbindung und möchte Bilder mit den Daten entweder von Picasso oder Glide, aber nicht tun zu füllen. So kann mir jeder helfen, was ich schreiben soll und wo ich den Code von Picasso oder Glide schreiben soll.füllen Sie Bilder mit Firebase Recycler-Adapter durch Datenbindung

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; 
} 

}

+0

gleiche Problem https://stackoverflow.com/questions/47356241/image-are-not-getting-loaded-using-firebaserecycleradapter –

Antwort

0

In meinem ViewHolder ich tun dies durch:

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

Ich habe noch nicht versucht, data binding dafür zu verwenden, aber der Code ist einfach genug.

+0

Ich habe mit viewholder versucht, aber es gibt einen doesnot Fehler Datenbindung existiert –

+0

SkImageDecoder :: Fabrik zurück Null –

1

Ich habe etwas Ähnliches gemacht, was Sie brauchen. Ich teile meinen Code und mache eine kleine Erklärung.

Ich habe eine Klasse, die die FirebaseRecyclerAdapter wie folgt zurück:

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()); 
       } 
      }); 
     } 
    }; 
} 

und einen ViewHolder, die das Bild in das Image durch das Layout verwendet lädt:

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

Auf Picasso Ich verwende die NerworkPolicy.OFFLINE, um zu überprüfen, ob sich das Image im Festplatten-Cache befindet, bevor Sie versuchen, es aus dem Netzwerk zu holen. Es ist nicht perfekt und ich habe immer noch Probleme mit der Verzögerung der Bilder, sobald der ViewHolder recycelt wurde, aber ich denke, es ist ein Anfang für dich, weiterzumachen.