2017-08-07 87 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剂量似乎出现在我添加的最新图像上。相反,它出现在以前保存的图像中,为什么会有线索? –