Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
701 views
in Technique[技术] by (71.8m points)

android - RecyclerView not showing anything after updating Adapter data

guys i need help with this matter i have been going through my code for a couple of days to figure whats going wrong but i couldn't figure it out. I have a fragment with a RecyclerView i initialize the Adapter data with an image place holder and some default text and the fragment shows them as expected then using a loader i fetch data from the internet and parse and pass the new data to the Adapter (all of this happens as required) until the data reaches the Adapter then Taaadaaaa the initial data disappears and the new data is not showing actually the fragment shows a blank screen definitely i am doing something wrong please advise. This is the fragment code

public class fragment_MovieStartGridlayout extends android.support.v4.app.Fragment implements MyGridAdapter.MyGridAdapterListener{

private static RecyclerView myRecyclerView;
private static MyGridAdapter myGridAdapter;
private static RecyclerView.LayoutManager rvLayoutManager;
private LoaderManager.LoaderCallbacks<ArrayList<HashMap>> dataLoaderCallbacks;


private OnFragmentInteractionListener mListener;

public fragment_MovieStartGridlayout() {

}

@Override
public void onActivityCreated  (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

  dataLoaderCallbacks = new LoaderManager.LoaderCallbacks<ArrayList<HashMap>>() {

  @Override
  public Loader<ArrayList<HashMap>> onCreateLoader(int id, Bundle args) {
   return new DataLoader(getActivityContext(), MyUriBuilder.DISCOVER, null);
            }

@Override
public void onLoadFinished(Loader<ArrayList<HashMap>> loader,ArrayList<HashMap> data) {
                myGridAdapter.setMyAdapterData(data);
            }

            @Override
            public void onLoaderReset(Loader<ArrayList<HashMap>> loader) {
                loader.reset();
            }

        };
        getLoaderManager().initLoader(0, null, dataLoaderCallbacks);

    setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View fragGridLayout = inflater.inflate(R.layout.fragment_gridlayout_movie_start, container, false);
    myRecyclerView = (RecyclerView) fragGridLayout.findViewById(R.id.myViewRecycler);
    rvLayoutManager = new GridLayoutManager(getActivityContext(),2);
    myRecyclerView.setLayoutManager(rvLayoutManager);
    myGridAdapter = new MyGridAdapter(getActivityContext());
    myRecyclerView.setAdapter(myGridAdapter);

    return fragGridLayout;
}


@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnFragmentInteractionListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDataSetChanged(boolean state) {
    if (state){
        myGridAdapter.notifyDataSetChanged();
    }
}


public interface OnFragmentInteractionListener {
    public void onFragmentInteraction(Uri uri);
}


    public Context getActivityContext(){
        return this.getActivity();
    }

}

and this is the Adapter for the RecyclerView

 public class MyGridAdapter extends RecyclerView.Adapter<MyGridAdapter.MyViewHolder> {

LayoutInflater layoutInflater;
private static ArrayList<HashMap> data=null;
private Context mContext;
public static Bitmap placeHolder;
    public MyGridAdapter(Context context){
      mContext = context;
      setInitialData();
      placeHolder =    BitmapFactory.decodeResource(mContext.getResources(),R.drawable.android_blue);
}
    public interface MyGridAdapterListener{
        public void onDataSetChanged(boolean state);
    }

private MyGridAdapterListener listener = null;
public void registerListener(MyGridAdapterListener newListener){
    listener = newListener;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    layoutInflater = LayoutInflater.from(context);
    View v = layoutInflater.inflate(R.layout.gridlayout_item_movie_start, parent, false);
    MyViewHolder vHolder=new MyViewHolder(v);
    return vHolder;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {

      HashMap singleData = data.get(position);
      String movieRate = String.valueOf(singleData.get(MyJSONDataParser.TAG_VOTE_AVERAGE)) ;
        holder.movieTitle.setText((String)singleData.get(MyJSONDataParser.TAG_TITLE));
        holder.moviePoster.setImageBitmap(placeHolder);
        holder.movieRating.setRating(Float.valueOf(movieRate));
}

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


public static class MyViewHolder extends RecyclerView.ViewHolder  {
    TextView movieTitle;
    RoundedImageView moviePoster;
    RatingBar movieRating;

    public MyViewHolder(View v) {
        super(v);
        movieTitle = (TextView) v.findViewById(R.id.movieTitleTextView);
        moviePoster = (RoundedImageView) v.findViewById(R.id.roundImageView);
        movieRating = (RatingBar) v.findViewById(R.id.ratingBar);
    }
}


private boolean dataChanged = false;

public void setMyAdapterData(ArrayList<HashMap> data){
        this.data = data;
        dataChanged = true;
        if (listener != null){
            listener.onDataSetChanged(dataChanged);
        }
    }


protected void setInitialData(){
    HashMap initialItem = new HashMap();
    ArrayList<HashMap> initialData = new ArrayList<>(20);

    initialItem.put(MyJSONDataParser.TAG_TITLE, "Loading...");
    initialItem.put(MyJSONDataParser.TAG_MOVIE_BITMAP, placeHolder);
    initialItem.put(MyJSONDataParser.TAG_VOTE_AVERAGE, 3.3);
    for (int i = 0;i<20;i++){
        initialData.add(initialItem);
    }
    this.data = initialData;
}

}

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I did call notifyDataSetChanged but this was not the issue after alooooooooot of testing and Logging the problem was with setAdapterData method where i just passed the data reference from the loader to the adapter but this didn't work and i had to clone the arraylist instead of just passing the reference which sounds strange to me and i still don't understand why I had to do that if you can take a look at the setAdapterData method in MyGridAdapter class and tell me what do you think ?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...