ade*_*dek 3 android android-adapter dialogfragment android-recyclerview
什么是最好的模式来做到这一点。我做了一些解决方法,但我觉得这是一个不好的模式。
我的场景。
我有主要活动
主活动.java
在此活动中,我正在使用 RecyclerView 加载 Fragment。
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
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;
...
Run Code Online (Sandbox Code Playgroud)
对话框中的 onClick:
mListener.onDialogClose();
Run Code Online (Sandbox Code Playgroud)
这个对话框有一些按钮。其中之一是例如修改/删除回收列表中的项目。在这个对话框中,我有 onDialogCloseListener 接口。我在我的 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();
}
Run Code Online (Sandbox Code Playgroud)
我可以通过这种方式使用 Activity 中的 mRecyclerView。例如,我可以让它不可见。但是 notifyDataSetChanged 不起作用。
我的解决方法是创建新的适配器 - 新的 sql 查询、新的对象列表并为 RecyclerView 再次设置。但这可能不是一个好方法。因为我不能例如保持滚动位置。
但是如何与适配器建立连接呢?我希望能够添加动画,例如删除项目。
编辑:
跑步
mRecyclerView.getAdapter().notifyItemRemoved(0);
Run Code Online (Sandbox Code Playgroud)
在 onDialogClose 中效果很好。列表被刷新。但是当我想做同样的事情时
mRecyclerView.getAdapter().notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
或者
mRecyclerView.getAdapter().notifyItemChanged(0);
Run Code Online (Sandbox Code Playgroud)
该列表并不令人耳目一新。
建议 1:不要在适配器类中显示对话框,例如onClick
在内部触发自己的侦听器Activity
onItemClicked(CostType costType)
class MyAdapter extends RecyclerView.Adapter .. {
public interface OnItemClickListener {
void onItemClicked(CostType costType);
}
private OnItemClickListener mListener;
// setter and getter for OnitemClickListener
// inside onBindViewHolder
viewHolder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
CostType costType = new CostType();
costType.setTypeID(mCostsType.get(position).getTypeID());
costType.setName(mType.get(position).getName());
costType.setPriority(0);
mListener.onItemClicked(costType);
}
}
class MyActivity extends Activity {
// inside onCreate
adapter.setOnItemClickListener(new ...);
}
Run Code Online (Sandbox Code Playgroud)
建议 2:如果您需要将结果从片段 B 传递到片段 A,则不需要使用活动,而是使用setTargetFragment
/getTargetFragment
方法。
// inside MyListFragment
MyDialogFragment frag = MyDialogFragment.newInstance();
frag.setTargetFragment(this, 0);
// commit transaction
// inside MyDialogFragment to trigger listener, make sure MyDialogFragment
// implement OnDialogCloseListener interface
((MyListFragment)getTargetFragment()).onDialogClose();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4863 次 |
最近记录: |