首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Parcelable改变原始数据

Parcelable改变原始数据
EN

Stack Overflow用户
提问于 2018-01-28 19:55:25
回答 1查看 37关注 0票数 0

我正在实现RecycleView,它将使用Parcelable显示从另一个片段传递的技能列表,当我从RecycleView上显示的技能中删除项目并返回到前一个片段时,该项目也会从原始数组列表中删除

下面是Parcelable对象

代码语言:javascript
复制
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];
    }
};
}

下面是传递的数据

代码语言:javascript
复制
      @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数组字符串列表的片段

代码语言:javascript
复制
  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;
}

  }

下面是适配器代码

代码语言:javascript
复制
     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();
}


   }
EN

回答 1

Stack Overflow用户

发布于 2018-01-28 20:14:15

这和预期的一样。

简单来说就是:-它允许你跨不同的组件发送一个对象。您在两个组件中引用了相同的对象。Parcellable已经在对象之上实现了。因此,如果对象发生任何更改,组件中的任何位置都会反射回使用相同对象的组件的其余部分。

我希望你能理解。

您应该做的是发送对象的副本,而不是原始对象。

如何克隆一个parcellable对象是这样的:

代码语言:javascript
复制
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();

我希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48486069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档