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并删除DataHandling
class
当我在主 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并删除DataHandling
class