2017-06-16 88 views
0

当我在主要活动中调用RecyclerView时,RecyclerView正在被刷新,但是当我使用FloatingActionButton时,它不再起作用,并且它没有给出任何错误。RecyclerView不刷新onClick

MainActivity

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    //Initially get the events 
    dh.getEvents(); 

    //Initially setting the list fragment 
    EventListFragment eventListFragment = new EventListFragment(); 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.replace(R.id.frame, eventListFragment, "list_fragment"); 
    fragmentTransaction.commit(); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      dh.getEvents(); 
     } 
    }); 
} 

此的onCreate方法是从DataHandalinggetEvents()方法

public void getEvents() { 

    OkHttpClient client = new OkHttpClient(); 

    Request request = new Request.Builder() 
      .url(enviroClass.url() + "/api/events/" + 7) 
      .build(); 

    client.newCall(request) 
      .enqueue(new Callback() { 
       @Override 
       public void onFailure(Call call, IOException e) { 
        e.printStackTrace(); 
       } 

       @Override 
       public void onResponse(Call call, Response response) throws IOException { 
        try { 
         JSONObject eventObject = new JSONObject(response.body().string()); 
         JSONArray eventJsonArray = eventObject.getJSONArray("events"); 
         for (int i = 0; i<eventJsonArray.length(); i++) { 
          eventObject = eventJsonArray.getJSONObject(i); 
          eventObject = eventObject.getJSONObject("event"); 
          eventArray.add(new Event(eventObject.getString("name"), eventObject.getString("address"), eventObject.getString("image"), "100", eventObject.getString("description"), eventObject.getString("start_date"), eventObject.getString("end_date"), eventObject.getInt("id"))); 
         } 
         EventListAdapter adapter = new EventListAdapter(eventArray, null); 
         adapter.notifyDataSetChanged(); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
} 

UPDATE

这是正在使用

的RecyclerAdapter
public class EventListAdapter extends RecyclerView.Adapter<EventListAdapter.ViewHolder> { 

    DataHandaling dh = new DataHandaling(); 

    private static ArrayList<Event> mValues; 
    private OnListFragmentInteractionListener mListener = null; 

    public EventListAdapter(ArrayList<Event> items, OnListFragmentInteractionListener listener) { 
     if (items != null) { 
      mValues = items; 
     } 
     if (listener != null) { 
      mListener = listener; 
     } 
    } 

    public void swap(ArrayList<Event> eventArray) { 
     mValues.clear(); 

     mValues.addAll(eventArray); 
     notifyDataSetChanged(); 
    } 

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

    @Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     holder.mItem = mValues.get(position); 
     holder.mIdView.setText(mValues.get(position).getStarTime()); 
     holder.mContentView.setText(mValues.get(position).getName()); 
     Picasso.with(getApplicationContext()).load(mValues.get(position).getImage()).into(holder.mImageView); 

     holder.mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (null != mListener) { 
        // Notify the active callbacks interface (the activity, if the 
        // fragment is attached to one) that an item has been selected. 
        mListener.onListFragmentInteraction(position); 
       } 
      } 
     }); 
    } 

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

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public final View mView; 
     public final TextView mIdView; 
     public final TextView mContentView; 
     public final ImageView mImageView; 
     public Event mItem; 

     public ViewHolder(View view) { 
      super(view); 
      mView = view; 
      mIdView = (TextView) view.findViewById(R.id.id); 
      mContentView = (TextView) view.findViewById(R.id.content); 
      mImageView = (ImageView) view.findViewById(R.id.eventImage); 
     } 

     @Override 
     public String toString() { 
      return super.toString() + " '" + mContentView.getText() + "'"; 
     } 
    } 
} 

这是片段onCreateView,其中适配器设置

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_item_list, container, false); 

    // Set the adapter 
    if (view instanceof RecyclerView) { 
     Context context = view.getContext(); 
     RecyclerView recyclerView = (RecyclerView) view; 
     if (mColumnCount <= 1) { 
      recyclerView.setLayoutManager(new LinearLayoutManager(context)); 
     } else { 
      recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount)); 
     } 

     recyclerView.setAdapter(new EventListAdapter(dh.getEventArray(), mListener)); 
    } 
    return view; 
} 
+0

你确定你在这里得到新的数据'.url(enviroClass.url()+“/ api/events /”+ 7)'? – Ibrahim

+0

@Ibrahim Ali,Yup,因为它在第一次启动应用程序时起作用,我再次用邮递员检查它...为了防止XD,它只是当我尝试使用按钮刷新它不起作用 – TheMysticalWarrior

+0

您能发表评论EventListAdapter请吗? –

回答

0

如果您创建一个新的适配器,您需要将其设置在RecyclerView

EventListAdapter adapter = new EventListAdapter(eventArray, null); 
myRecyclerView.setAdapter(adapter) 

DataHandling应有权访问RecyclerView

或者您可以使用以前创建的适配器:

在片段,更改:

recyclerView.setAdapter(new EventListAdapter(dh.getEventArray(), mListener)); 

通过

mAdapter = new EventListAdapter(dh.getEventArray(), mListener) 
recyclerView.setAdapter(mAdapter); 

在getEvents():

mAdapter.swap(eventArray); 

这意味着DataHandling类应该有机会获得mAdapter,你可以通过它在构造器中,或者您应该将getEvents()移动到Fragment和de lete DataHandling class

+0

我之前使用过一种类似的方法,当应用程序第一次启动但是没有工作时当我想要刷新后 'public void swap(ArrayList eventArray){ mValues.clear(); mValues.addAll(eventArray); notifyDataSetChanged(); }' – TheMysticalWarrior

+0

我在代码中看不到您在哪里调用myRecyclerView。setAdapter(adapter) –

+0

好的我已经编辑了这个问题,向你展示了ListFragment的onCreateView,这是适配器第一次设置的地方,它没有在问题或者我给你展示的方法中设置的原因是因为我不知道如何在片段外面设置它xD – TheMysticalWarrior