-1

我需要帮助解决这个问题我已经通过我的代码几天了解什么是错误的,但我无法弄清楚。 我有一个RecyclerView的片段,我用一个图像占位符和一些默认文本初始化适配器数据,片段显示它们如预期那样使用加载器从互联网获取数据并解析并将新数据传递给适配器所有这一切都按需要发生),直到数据到达适配器,然后Taaadaaaa最初的数据消失,并且新的数据实际上并未显示该片段显示一个空白屏幕肯定我做错了,请指教。 这是片段代码RecyclerView在更新适配器数据后没有显示任何东西

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(); 
    } 

}

,这是适配器的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; 
} 

}

+0

代码缩进存在问题,某些代码显示为纯文本,我没有看到数据在适配器中声明的位置,并且没有遵循Android命名约定(小写的第一个字母代表您的类,没有m的数据前缀为成员变量) –

+0

代码显示为纯文本这发生在我写这篇文章时,因为这是第一次在这里发布问题,因为适配器变量肯定是我错过了,包括他们,他们是{Context mContext; Arraylist data = null;位图placeHolder;} –

+0

你应该编辑你的问题 –

回答

2

我打过电话notifyDataSetChanged 但这不是alooooooooot后的问题的测试和日志记录问题是与setAdapterData方法,其中我只是从加载器传递数据引用到适配器,但这并没有工作,我不得不克隆ArrayList,而不是传递给我听起来很奇怪的参考,我仍然不明白为什么我必须这样做,如果你可以看看MyGridAdapter类中的setAdapterData方法,并告诉我你认为怎么样

0

尝试调用notifyDataSetChanged()当您修改适配器的数据:

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

我看到你试图在你的监听器的回调中做到这一点,但也许它是空的,因此从不发出通知?

[注释] 当我想要替换整个数据集在我的适配器我经常写类似这样的方法:

public void setData(List<MyData> newData) { 
    this.data.clear(); 
    this.data.addAll(newData); 
    this.notifyDataSetChanged(); 
} 
相关问题