我正在实现RecycleView,它将使用Parcelable显示从另一个片段传递的技能列表,当我从RecycleView上显示的技能中删除项目并返回到前一个片段时,该项目也会从原始数组列表中删除
下面是Parcelable对象
public class Skills implements Parcelable {
private ArrayList<String> skills;
public ArrayList<String> getVacancySkills() {
return skills;
}
public void setSkills(ArrayList<String> skills) {
this.skills = skills;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringList(this.skills);
}
public Skills() {
}
protected Skills(Parcel in) {
this.skills = in.createStringArrayList();
}
public static final Parcelable.Creator<Skills> CREATOR = new Parcelable.Creator<Skills>() {
@Override
public Skills createFromParcel(Parcel source) {
return new Skills(source);
}
@Override
public Skills[] newArray(int size) {
return new Skills[size];
}
};
}下面是传递的数据
@OnClick(R.id.card_add_skill)
public void showAddSkills() {
Bundle data = new Bundle();
Skills skills = new Skills();
skills.setSkills(skillsLit);
data.putParcelable(ExtraKeys.VACANCY_SKILLS, skills);
VacancyEditSkillsFragment vacancyEditSkillsFragment = new VacancyEditSkillsFragment();
FragmentUtils.addFragment(
getActivity().getSupportFragmentManager(),
vacancyEditSkillsFragment
,
true,
App.getContext().getString(R.string.skills), data
);
}下面是接收Parcable数组字符串列表的片段
public class VacancyEditSkillsFragment extends Fragment {
@BindView(R.id.rc_edit_skill_recycle)
RecyclerView editSkillsRecycle;
private Skills mSkills;
private EditVacancySkillsAdapter mEditVacancySkillsAdapter;
public VacancyEditSkillsFragment() {
// Required empty public constructor
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getArguments() != null) {
mSkills = getArguments().getParcelable(ExtraKeys.VACANCY_SKILLS);
}
mEditVacancySkillsAdapter = new EditVacancySkillsAdapter(mSkills.getVacancySkills());
editSkillsRecycle.setLayoutManager(new LinearLayoutManager(getActivity()));
editSkillsRecycle.setAdapter(mEditVacancySkillsAdapter);
}
public static VacancyEditSkillsFragment newInstance() {
VacancyEditSkillsFragment fragment = new VacancyEditSkillsFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_vacancy_edit_skills, container, false);
ButterKnife.bind(this, view);
return view;
}
}下面是适配器代码
public class EditVacancySkillsAdapter extends RecyclerView.Adapter<EditVacancySkillsAdapter.EditSkillViewHolder> {
private List<String> skills;
public class EditSkillViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@BindView(R.id.tv_skill_name)
TextView skillTitle;
@BindView(R.id.iv_reomve_skill)
ImageView deleteSkill;
public EditSkillViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
deleteSkill.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(view.getId()== R.id.iv_reomve_skill)
{
skills.remove(getAdapterPosition());
notifyDataSetChanged();
}
}
}
public EditVacancySkillsAdapter(ArrayList<String> sections) {
this.skills = sections;
if (skills == null) {
skills = new ArrayList<>();
}
}
@Override
public EditSkillViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_edit_vacancy_skill, parent, false);
return new EditSkillViewHolder(itemView);
}
@Override
public void onBindViewHolder(EditSkillViewHolder holder, int position) {
holder.skillTitle.setText(skills.get(position));
}
@Override
public int getItemCount() {
return skills.size();
}
}发布于 2018-01-28 20:14:15
这和预期的一样。
简单来说就是:-它允许你跨不同的组件发送一个对象。您在两个组件中引用了相同的对象。Parcellable已经在对象之上实现了。因此,如果对象发生任何更改,组件中的任何位置都会反射回使用相同对象的组件的其余部分。
我希望你能理解。
您应该做的是发送对象的副本,而不是原始对象。
如何克隆一个parcellable对象是这样的:
Foo foo1 = new Foo("a", "b", "c");
Parcel p = Parcel.obtain();
p.writeValue(foo1);
p.setDataPosition(0);
Foo foo2 = (Foo)p.readValue(Foo.class.getClassLoader());
p.recycle();我希望这能有所帮助!
https://stackoverflow.com/questions/48486069
复制相似问题