По какой схеме лучше всего это сделать. Я сделал обходной путь, но я чувствую, что это плохой шаблон.
Мой сценарий.
У меня есть основная активность
MainActivity.java
В этом упражнении я загружаю Fragment с помощью RecyclerView.
ListFragment.java
У меня также есть DialogFragment и ItemAdapter.
Из адаптера я показываю DialogFragment
Полный код адаптера
public class TypeAdapter extends RecyclerView.Adapter<CostTypeAdapter.ViewHolder> {
private static final String TAG = "TypeAdapter";
private List<CostType> mCostsType;
private Context mContext;
public CostTypeAdapter(Context context, List<CostType> coststype) {
mContext = context;
mCostsType = coststype;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
// Create a new view.
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.costtype_row, viewGroup, false);
return new ViewHolder(v);
}
// BEGIN_INCLUDE(recyclerViewOnBindViewHolder)
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
//Log.d(TAG, "Element " + position + " set.");
String Name = mCostsType.get(position).getName();
viewHolder.tvName.setText(Name);
//mView click
viewHolder.cardView.setPreventCornerOverlap(false);
viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Dialog here
FragmentActivity activity = (FragmentActivity)(mContext);
FragmentManager fm = activity.getSupportFragmentManager();
CostType costType = new CostType();
costType.setTypeID(mCostsType.get(position).getTypeID());
costType.setName(mType.get(position).getName());
costType.setPriority(0);
CostsTypeDialogFragment alertDialog = CostsTypeDialogFragment.newInstance(costType);
alertDialog.show(fm, "cost_type");
}
});
}
// END_INCLUDE(recyclerViewOnCreateViewHolder)
public void refreshList() {
this.notifyDataSetChanged();
System.out.println("refreshList");
}
@Override
public int getItemCount() {
return mType.size();
}
/**
* Provide a reference to the type of views that you are using (custom ViewHolder)
*/
public static class ViewHolder extends RecyclerView.ViewHolder {
private final TextView tvName;
private final CardView cardView;
public ViewHolder(View v) {
super(v);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "Element " + getPosition() + " clicked.");
}
});
tvName = (TextView) v.findViewById(R.id.tvName);
cardView = (CardView) v.findViewById(R.id.card_view);
}
}
}
DialogFragment.java У меня есть прослушиватель этого диалога для связи с MainActivity.
onDialogCloseListener mListener;
// Container Activity must implement this interface
public interface onDialogCloseListener {
public void onDialogClose();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (onDialogCloseListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnDialogClose listener");
}
}
private List<MyType> mType;
...
onClick из диалогового окна:
mListener.onDialogClose();
В этом диалоге есть какая-то кнопка. Одним из них является, например, изменение/удаление элемента в списке повторного использования. В этом диалоге у меня есть интерфейс onDialogCloseListener. Я использую в своей MainActivity.
MainActivity.java
public class MainActivity extends BaseActivity implements DialogFragment.onDialogCloseListener {
...
@Override
public void onDialogClose() {
RecyclerView mRecyclerView;
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
//not working
mRecyclerView.getAdapter().notifyDataSetChanged();
}
Таким образом я могу использовать mRecyclerView из Activity. Я могу, например, сделать его невидимым. Но notifyDataSetChanged не работает.
Мой обходной путь - создать новый адаптер - новый SQL-запрос, новый список объектов и снова установить его для RecyclerView. Но это, наверное, не лучший способ. Потому что я не могу, например, сохранить положение прокрутки.
Но как сделать соединение с адаптером? Я хочу иметь возможность добавить анимацию, например, для удаления элемента.
Изменить:
Бег
mRecyclerView.getAdapter().notifyItemRemoved(0);
в onDialogClose отлично работает. Список обновляется. Но когда я хочу сделать то же самое с
mRecyclerView.getAdapter().notifyDataSetChanged();
or
mRecyclerView.getAdapter().notifyItemChanged(0);
Список не обновляется.