RecyclerView 不刷新 onClick

RecyclerView not refreshing onClick

当我在主 activity 中调用 RecyclerView 时,RecyclerView 正在刷新,但是当我使用 FloatingActionButton 时,它不再有效,并且没有提供任何关于原因的错误。

来自 MainActivity

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

这是 DataHandaling class

中的 getEvents() 方法
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();
                    }
                }
            });
}

更新

这是正在使用的 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的Fragment

@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;
}

如果创建新的适配器,需要在 RecyclerView

中进行设置
 EventListAdapter adapter = new EventListAdapter(eventArray, null);
 myRecyclerView.setAdapter(adapter)

class DataHandling 应该可以访问 RecyclerView

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

在片段中,更改:

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

来自

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

在 getEvents() 中:

mAdapter.swap(eventArray);

意思是DataHandling class应该可以访问mAdapter,你可以在构造函数中传递它,或者你应该将getEvents()移动到Fragment并删除DataHandlingclass