2017-02-09 1 views
0

я использую DataBinding для привязки изображения в RecyclerView пункта как код ниже, то это сделать мерцание изображения, когда я перезагрузить все RecyclerView (по notifyDataSetChange)
Если я не использую DataBinding и просто установите изображение нормально, изображение не мерцает Что я сделал не так с DataBinding? Любая помощь или предложение было бы большим оцененнымМерцание изображения при привязке изображения в RecyclerView элементе с помощью Databinding

Моего RecyclerView адаптера кода

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> { 
    private Context mContext; 
    private List<String> list; 
    public static class MyViewHolder extends RecyclerView.ViewHolder { 
     ItemBinding mBinding; 
     public MyViewHolder(ItemBinding mBinding) { 
      super(mBinding.getRoot()); 
      this.mBinding = mBinding; 
      mBinding.setViewHolder(this); 
     } 

     public int getSrc(){ 
      return R.drawable.ic_launcher; 
     } 
    } 
    public RecyclerViewAdapter(Context context, List<String> moviesList) { 
     this.mContext = context; 
     this.list = moviesList; 
    } 
    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     ItemBinding binding = 
       DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item, 
         parent, false); 
     return new MyViewHolder(binding); 
    } 
    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
    } 
    @Override 
    public int getItemCount() { 
     return list.size(); 
    } 
    @BindingAdapter({ "src" }) 
    public static void setImageSrc(ImageView view, int src) { 
     if (src != -1) view.setImageResource(src); 
    } 
} 

Моего деталь XML

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
> 
    <data> 
     <variable 
      name="viewHolder" 
      type="example.toong.testreloadimageusingglidebynotifydatasetchangewithdatabinding.RecyclerViewAdapter.MyViewHolder" 
     /> 
    </data> 
    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/bg_holding_three_gradient_layer" 
     android:orientation="vertical"> 

     <ImageView 
      android:id="@+id/imageView" 
      android:layout_width="100dp" 
      android:layout_height="100dp" 
      app:src="@{viewHolder.src}" 
     /> 

    </LinearLayout> 
</layout> 

enter image description here

Демо Проект: https://drive.google.com/file/d/0B_poNaia6t8kVlBfSGJ4QU9uZHc/view

+0

образы сети изображения? кеширование и загрузка? – OBX

+0

@OBX это просто изображение в файле (ic_launcher), которое вы можете увидеть в моем коде. 'app: src =" @ {viewHolder.src} "и' public int getSrc() { return R.drawable.ic_launcher; } ' –

+0

Вы попробовали с библиотекой для загрузки изображений? Как пикассо? Может быть, это должно помочь – OBX

ответ

1

Есть два способа возможно, может помочь вам

1.Запись свой собственный адаптер

.notifyDataSetChange() .Couldn't workwell в Databinding

public class BindingRecyclerView { 

public static abstract class ListAdapter<T, VH extends ViewHolder> extends RecyclerView.Adapter<VH> { 

    protected final LayoutInflater inflater; 
    protected final ObservableList<T> data; 

    private final AtomicInteger refs = new AtomicInteger(); 

    private final ObservableList.OnListChangedCallback<ObservableList<T>> callback = 
      new ObservableList.OnListChangedCallback<ObservableList<T>>() { 
       @Override 
       public void onChanged(ObservableList<T> sender) { 
        notifyDataSetChanged(); 
       } 

       @Override 
       public void onItemRangeChanged(ObservableList<T> sender, 
               int positionStart, int itemCount) { 
        notifyItemRangeChanged(positionStart, itemCount); 
       } 

       @Override 
       public void onItemRangeInserted(ObservableList<T> sender, 
               int positionStart, int itemCount) { 
        notifyItemRangeInserted(positionStart, itemCount); 
       } 

       @Override 
       public void onItemRangeMoved(ObservableList<T> sender, 
              int fromPosition, int toPosition, int itemCount) { 
        for (int i = 0; i < itemCount; i++) { 
         notifyItemMoved(fromPosition + i, toPosition + i); 
        } 
       } 

       @Override 
       public void onItemRangeRemoved(ObservableList<T> sender, 
               int positionStart, int itemCount) { 
        notifyItemRangeRemoved(positionStart, itemCount); 
       } 
      }; 

    public ListAdapter(Context context, ObservableList<T> data) { 
     this.inflater = LayoutInflater.from(context); 
     this.data = data; 
    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     if (refs.getAndIncrement() == 0) { 
      data.addOnListChangedCallback(callback); 
     } 
    } 

    @Override 
    public void onDetachedFromRecyclerView(RecyclerView recyclerView) { 
     if (refs.decrementAndGet() == 0) { 
      data.removeOnListChangedCallback(callback); 
     } 
    } 

} 

public static class ViewHolder<V extends ViewDataBinding> extends RecyclerView.ViewHolder { 

    public final V binding; 

    public ViewHolder(LayoutInflater inflater, @LayoutRes int layoutId, ViewGroup parent) { 
     this(DataBindingUtil.<V>inflate(inflater, layoutId, parent, false)); 
    } 

    public ViewHolder(V binding) { 
     super(binding.getRoot()); 
     this.binding = binding; 
    } 
}} 

2.При вы должны обновить свои данные, необходимо новый адаптер не использовать старый , Это может также помочь

Первый класс не написал мной. Но это действительно сработало в нашем проекте. Когда я использую PageAdapter Он также не будет обновляться .notifyDataSetChange() Но в этом адаптере я могу использовать другой способ принудительного обновления. Так что я немного об этом знаю. Надеюсь, это было бы полезно .....

+0

благодарю вас за ответ. 1. Я написал свой адаптер RecyclerView (это в моем вопросе), я вижу ваш адаптер но я не вижу другой вещи, которая может помочь мне решить мою проблему.Пожалуйста, помогите мне объяснить больше 2. Мне нужно обновить все RecyclerView, поэтому я должен использовать notifyDataSetChange –

+0

notifyDataSetChange не будет влиять, когда вы используете Databinding .so 2 означает, что после того, как вы измените свои данные, сделайте новый адаптер вместо использования notifyDataSetChange, чтобы обновить его. –

+0

Не думаю, что когда я использую notifyDataSetChange, обновление RecryclerView. –

Смежные вопросы