2017-08-07 69 views
0

目標:我想在RecyclerView中更改我的progressBar's可見性,以指示當用戶添加具有addImage()的圖像時,圖像正在加載。在RecyclerView中更改視圖的狀態

問題:addImage應該改變progressBar's的可見性。但是,當調用addImage()時,不會創建查看者,因此progressBar未定義。

MainActivity

recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
    GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2); 
    recyclerView.setLayoutManager(gridLayoutManager); 

    recyclerView.setAdapter(galleryAdapter); 

    if (getArguments() != null) { 
     if (getArguments().containsKey(PhotoFragment.IMAGE_URI)) { 
      final Uri imageUri = Uri.parse(getArguments().getString(PhotoFragment.IMAGE_URI)); 
      galleryAdapter.addImage(imageUri); 
      galleryAdapter.notifyDataSetChanged(); 
      getArguments().remove(PhotoFragment.IMAGE_URI); 
     } 
    } 

RecyclerView(其中問題所在)

public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.GalleryViewHolder> { 


ArrayList<Uri> imageUriArrayList = new ArrayList<>(); 
File[] listFile; 
ProgressBar progressBar; 
private GalleryFragment mFragment; 
private String airBnbDirectory = "/Airbnb"; 
SharedPreferences sharedPreferences; 
SharedPreferences.Editor edit; 

public GalleryAdapter(GalleryFragment fragment) { 
    mFragment = fragment; 
    loadSDCard(); 
} 

public void addImage(final Uri imageUri) { 
    imageUriArrayList.add(imageUri); 

    //Save image in SD CARD(External Storage) 
    new AsyncTask<Void, Void, Void>() { 
     // 
     String imageUriForLoadingSP; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      Log.d("adapter", "OnPreExecute"); 
      progressBar.setVisibility(View.VISIBLE); 
      //Cannot get progressBar because it's not created by the ViewHolder yet. 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      imageUriForLoadingSP = saveInSDCard(imageUri); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      Log.d("mattSaving", "onPostExecute"); 
      progressBar.setVisibility(View.GONE); 

     } 
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); 


} 




} 

@Override 
public GalleryAdapter.GalleryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.gallery_adapter_item, parent, false); 
    return new GalleryAdapter.GalleryViewHolder(view); 
} 

@Override 
public void onBindViewHolder(GalleryAdapter.GalleryViewHolder holder, int position) { 
    holder.bindView(position); 
} 

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

public class GalleryViewHolder extends RecyclerView.ViewHolder { 
    ImageView ivPhoto; 

    public GalleryViewHolder(View itemView) { 
     super(itemView); 
     Log.d("adapter", "ViewHolder"); 
     ivPhoto = (ImageView) itemView.findViewById(R.id.ivPhoto); 
     progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar); 

    } 

    public void bindView(final int position) { 
     //load images called by addImage() 
     Glide.with(mFragment) 
       .load(imageUriArrayList.get(position)) // Uri of the picture 
       .into(ivPhoto); 

    } 

} 

    } 

回答

0

必須調用notifyItemChanged(位置),以更新視圖項。

public void addImage(final Uri imageUri) { 
    imageUriArrayList.add(imageUri); 

//Save image in SD CARD(External Storage) 
new AsyncTask<Void, Void, Void>() { 
    // 
    String imageUriForLoadingSP; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     Log.d("adapter", "OnPreExecute"); 
     progressBar.setVisibility(View.VISIBLE); 
     //Cannot get progressBar because it's not created by the ViewHolder yet. 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     imageUriForLoadingSP = saveInSDCard(imageUri); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     Log.d("mattSaving", "onPostExecute"); 
     progressBar.setVisibility(View.GONE); 

    } 
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null); 


} 

你可以把這個notifyItemChanged(position);在imageUriArrayList.add(imageUri)下;但是你必須提供一個位置,或者你可以嘗試在那裏使用notifyDataSetChanged。不知道這將如何工作。

+0

謝謝,但我會堅持學習目的的progressBar理念。任何想法如何解決這個問題,而無需刪除progressBar? –

+0

答覆已更新。 – Bryan

+0

我現在可以調用progressBar而不會出現空指針異常!但progressBar劑量似乎出現在我添加的最新圖像上。相反,它出現在以前保存的圖像中,爲什麼會有線索? –

相關問題