1

이미지가 이미지 뷰로로드 될 때까지 진행률 표시 줄을 실행하고 싶습니다. 바인딩 어댑터를 통해 구현하고 싶습니다. imageUrl의 bindingadpter가있는 CustomBinder 클래스가 있습니다. 이것은 그들의에서는 ProgressBar는 이미지의로드가 완료 전까지 내가 볼에 progrssbar을 원하는 내 XML로Android 데이터 바인딩 바인딩 어댑터의 매개 변수로 위젯 추가

public class CustomBinders { 

    static ImageLoader imageLoader; 
    public static DisplayImageOptions options; 
    private static final String TAG = "CustomBinders"; 

    @BindingAdapter({"imageUrl"}) 
    public static void loadImage(ImageView view, String imageUrl){ 
     imageLoader= ImageLoader.getInstance(); 
     options = StaticMethods.setUIL(); 
     Log.d(TAG, "loadImage: "); 
     imageLoader.displayImage(imageUrl, view, options, new SimpleImageLoadingListener() { 
      @Override 
      public void onLoadingStarted(String imageUri, View view) { 

      } 

      @Override 
      public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
       String message = null; 
       switch (failReason.getType()) { 
        case IO_ERROR: 
         message = "Input/Output error"; 
         break; 
        case DECODING_ERROR: 
         message = "Image can't be decoded"; 
         break; 
        case NETWORK_DENIED: 
         message = "Downloads are denied"; 
         break; 
        case OUT_OF_MEMORY: 
         message = "Out Of Memory error"; 
         break; 
        case UNKNOWN: 
         message = "Unknown error"; 
         break; 
       } 
       view.setBackgroundResource(R.drawable.blank); 

      } 

      @Override 
      public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 

      } 
     }); 
    } 
} 

binder- 내 사용자 정의입니다. 그것은 데이터 바인딩 된 내 XML입니다.

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
    > 
    <data class="ArtListCreatedByBind"> 
     <variable 
      name="artlist" 
      type="com.twebexponent.artwork.data.ArtListCreatedBy"/> 
    </data> 

    <FrameLayout 
     android:id="@+id/myContainer" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:visibility="visible" 
     android:background="@drawable/manageartwork_border"> 

     <ProgressBar 
      android:id="@+id/progressBar" 
      style="?android:attr/progressBarStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:layout_gravity="center" 
      android:layout_marginBottom="20dp" 
      android:layout_marginTop="20dp" 
      android:visibility="gone" /> 

     <ImageView 
      android:id="@+id/art_img" 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:scaleType="centerCrop" 
      android:adjustViewBounds="true" 
      app:imageUrl="@{artlist.image}" 
      /> 
    </FrameLayout> 



</layout> 

그리고 이전에는 BindingAdapter를 호출하지 않고 바인딩을 사용하여 뷰를 호출했을 때였습니다.

viewDataBinding.progressBar.setVisibility(View.VISIBLE); 
     imageLoader.displayImage(artListModel.getImage(), viewDataBinding.artImg, options, new SimpleImageLoadingListener() { 
      @Override 
      public void onLoadingStarted(String imageUri, View view) { 

      } 

      @Override 
      public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
       String message = null; 
       switch (failReason.getType()) { 
        case IO_ERROR: 
         message = "Input/Output error"; 
         break; 
        case DECODING_ERROR: 
         message = "Image can't be decoded"; 
         break; 
        case NETWORK_DENIED: 
         message = "Downloads are denied"; 
         break; 
        case OUT_OF_MEMORY: 
         message = "Out Of Memory error"; 
         break; 
        case UNKNOWN: 
         message = "Unknown error"; 
         break; 
       } 

       viewDataBinding.progressBar.setVisibility(View.GONE); 
       viewDataBinding.artImg.setBackgroundResource(R.drawable.blank); 

      } 

      @Override 
      public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
       viewDataBinding.progressBar.setVisibility(View.GONE); 
      } 
     }); 

위의 코드에서 나는 처음으로 progressbar를 볼 수 있으며 이미지가로드 될 때 나는 단순히 progressbar를 지나친 것입니다. 이제 같은 approch @ BindingAdapter ({ "imageUrl"}) 사용하여 어떻게 할 것인가 ??

이 당신의 BindingAdapter 방법 recylerview-

public class ArtistCreatedByAdapter extends RecyclerView.Adapter<ArtistCreatedByAdapter.CustomViewHolder> { 


    ArrayList<ArtListCreatedBy> createdByArtList; 
    Activity activity; 
    LayoutInflater inflater; 
    ImageLoader imageLoader; 
    public DisplayImageOptions options; 
    ArtListCreatedByBind viewDataBinding; 

    public class CustomViewHolder extends RecyclerView.ViewHolder { 

     private ArtListCreatedByBind mViewDataBinding; 

     public CustomViewHolder(View v) { 
      super(v); 

      mViewDataBinding = DataBindingUtil.bind(v); 
      mViewDataBinding.executePendingBindings(); 

     } 

     public ArtListCreatedByBind getViewDataBinding() { 
      return mViewDataBinding; 
     } 
    } 

    public ArtistCreatedByAdapter(Activity activity, ArrayList<ArtListCreatedBy> createdByArtList) { 
     this.activity = activity; 
     imageLoader= ImageLoader.getInstance(); 
     this.createdByArtList = createdByArtList; 
    } 

    @Override 
    public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View itemView = inflater.inflate(R.layout.singlerow_art_list_created_by, parent, false); 

     return new CustomViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(CustomViewHolder holder, final int position) { 
     ArtListCreatedBy artListModel= createdByArtList.get(position); 
     viewDataBinding = holder.getViewDataBinding(); 

     viewDataBinding.setArtlist(artListModel); 


    } 

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


} 

답변

3

바인딩의 다른 매개 변수처럼 내 어댑터 모습

@BindingAdapter({"imageUrl","progressbar"}) 
public static void loadImage(ImageView view, String imageUrl, ProgressBar progressBar){ 
    ... 
    ... 
    @Override 
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
     progressBar.setVisibility(View.GONE); 
    } 
} 

지금과 같이 XML에서의 ProgressBar를 전달할 것입니다 :

<ImageView 
     android:id="@+id/art_img" 
     android:layout_width="match_parent" 
     android:layout_height="100dp" 
     android:scaleType="centerCrop" 
     android:adjustViewBounds="true" 
     app:imageUrl="@{artlist.image}" 
     app:progressbar="@{progressBar}"/> 

참고 : 여기 progressBar은 이드가 될 것입니다. ProgressBar

+0

답변 해 주셔서 감사합니다. 5 분 이내에 답변을 드리겠습니다. – Subho

+1

감사의 말을 전하지 않습니다. – Subho

+1

글을 참고하세요 : –