我有一个适配器用于我的RecyclerView
。每个适配器的项目有ImageView
和另一个适配器RecyclerView
,其中每个项目也有ImageView
。我必须点击子项并转到其详细视图。在这个视图中,当我点击REMOVE按钮时,它必须删除这个子项。所以我有几个问题:Android从RecyclerView删除子项目
- 我在主适配器,它有两个参数实现方法:在主列表中的位置和在子列表中的位置。这就是我试图去除它。问题是,当我在一个位置删除一个子项时,它会删除另一个位置中的相同子项(我使用假数据,其中一些是相同的)。
- 删除一个子项后,当我尝试删除第二个子项时,它不会删除。我已经检查了调试模式,并且看到子项目列表的大小在开始时变得如此。
有我的适配器的代码。在主适配器我有子项的适配器内部类:
public class PhotoWithDuplicatesAdapterTest extends RecyclerView.Adapter<PhotoWithDuplicatesAdapterTest.ViewHolder> {
private Context mContext;
private List<MediaWithDuplicatesTest> mTests;
private OnDuplicateClickListener mListener;
public PhotoWithDuplicatesAdapterTest(Context context, List<MediaWithDuplicatesTest> tests) {
mContext = context;
mTests = tests;
}
public interface OnDuplicateClickListener {
void onDuplicateClick(int photoPosition, int duplicatePosition);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.photo_with_duplicates_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Picasso.with(mContext)
.load(mTests.get(position).getPhoto())
.fit()
.centerCrop()
.into(holder.mPhotoImageView);
DuplicateAdapter adapter = new DuplicateAdapter(mContext, position, mTests.get(position).getDuplicates());
adapter.setOnDuplicateClickListener(new DuplicateAdapter.OnDuplicateClickListener() {
@Override
public void onDuplicateClick(int photoPosition, int duplicatePosition) {
if (mListener != null) mListener.onDuplicateClick(photoPosition, duplicatePosition);
}
});
LinearLayoutManager manager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false);
holder.mDuplicatesRecyclerView.setLayoutManager(manager);
holder.mDuplicatesRecyclerView.setAdapter(adapter);
}
@Override
public int getItemCount() {
return mTests.size();
}
public void setOnDuplicateClickListener(OnDuplicateClickListener listener) {
mListener = listener;
}
public void removeDuplicate(int photoPosition, int duplicatePosition) {
List<String> duplicates = mTests.get(photoPosition).getDuplicates();
duplicates.remove(duplicatePosition);
if (duplicates.size() == 0) {
mTests.remove(photoPosition);
notifyItemRemoved(photoPosition);
} else notifyItemChanged(photoPosition);
}
public String getDuplicate(int photoPosition, int duplicatePosition) {
return mTests.get(photoPosition).getDuplicates().get(duplicatePosition);
}
public class ViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.iv_photo) SquareImageView mPhotoImageView;
@Bind(R.id.rv_duplicates) RecyclerView mDuplicatesRecyclerView;
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
public static class DuplicateAdapter extends RecyclerView.Adapter<DuplicateAdapter.ViewHolder> {
private Context mContext;
private int mPhotoPosition;
private List<String> mDuplicates;
private OnDuplicateClickListener mListener;
public DuplicateAdapter(Context context, int photoPosition, List<String> duplicates) {
mContext = context;
mPhotoPosition = photoPosition;
mDuplicates = duplicates;
}
public interface OnDuplicateClickListener {
void onDuplicateClick(int photoPosition, int duplicatePosition);
}
@Override
public DuplicateAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.duplicate_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(DuplicateAdapter.ViewHolder holder, int position) {
Picasso.with(mContext)
.load(mDuplicates.get(position))
.fit()
.centerCrop()
.into(holder.mDuplicateImageView);
}
@Override
public int getItemCount() {
return mDuplicates == null ? 0 : mDuplicates.size();
}
public void setOnDuplicateClickListener(OnDuplicateClickListener listener) {
mListener = listener;
}
public class ViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.iv_duplicate) SquareImageView mDuplicateImageView;
@OnClick(R.id.iv_duplicate)
void onDuplicateClick() {
if (mListener != null) mListener.onDuplicateClick(mPhotoPosition, getAdapterPosition());
}
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
}
}
这就是我所说如何删除子项(在Activity
)
// implementing of DuplicatesFragment.OnRemoveListener
@Override
public void onRemove(int photoPosition, int duplicatePosition) {
fm.popBackStackImmediate();
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
if (fragment instanceof DuplicatesFragment) {
DuplicatesFragment duplicatesFragment = (DuplicatesFragment) fragment;
duplicatesFragment.removeDuplicate(photoPosition, duplicatePosition);
}
}
而且removeDuplicate
方法DuplicatesFragment
:
public void removeDuplicate(int photoPosition, int duplicatePosition) {
if (mAdapter != null) mAdapter.removeDuplicate(photoPosition, duplicatePosition);
}
mAdapter - PhotoWithDuplicatesAdapterTest
的实例。我究竟做错了什么?
有MediaWithDuplicatesTest
对象:
public class MediaWithDuplicatesTest {
private String mPhoto;
private List<String> mDuplicates;
public String getPhoto() {
return mPhoto;
}
public void setPhoto(String photo) {
mPhoto = photo;
}
public List<String> getDuplicates() {
return mDuplicates;
}
public void setDuplicates(List<String> duplicates) {
mDuplicates = duplicates;
}
}
也许,这将是有益的,如果我还张贴创建我的测试数据和适配器的代码:
private void populateRecyclerViewHolder() {
LinearLayoutManager manager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
mAdapter = new PhotoWithDuplicatesAdapterTest(getContext(), getFakeData());
mAdapter.setOnDuplicateClickListener(this);
mViewHolder.mPhotosWithDuplicatesRecyclerView.setLayoutManager(manager);
mViewHolder.mPhotosWithDuplicatesRecyclerView.setAdapter(mAdapter);
}
private List<MediaWithDuplicatesTest> getFakeData() {
List<MediaWithDuplicatesTest> fakeData = new ArrayList<>();
List<String> fakeDuplicates = getFakeDuplicates();
for (String fakeDuplicate : fakeDuplicates) {
MediaWithDuplicatesTest fake = new MediaWithDuplicatesTest();
fake.setPhoto(fakeDuplicate);
fake.setDuplicates(fakeDuplicates);
fakeData.add(fake);
}
return fakeData;
}
private List<String> getFakeDuplicates() {
return new ArrayList<String>() {
{
add("http://2.bp.blogspot.com/-CmBgofK7QzU/TVj3u3N1h2I/AAAAAAAADN8/OszBhGvvXRU/s640/tumblr_lg7h9gpbtP1qap9qio1_500.jpeg");
add("http://www.newcastlewildflower.com.au/wp-content/uploads/2013/05/9fkUCY02te7bqobeZzdT9SEio1_500.jpg");
add("http://img.ffffound.com/static-data/assets/6/51cc46900bf5fe574293d49c4d9939e0ebfc8ee3_m.jpg");
add("http://2.bp.blogspot.com/-CmBgofK7QzU/TVj3u3N1h2I/AAAAAAAADN8/OszBhGvvXRU/s640/tumblr_lg7h9gpbtP1qap9qio1_500.jpeg");
add("http://www.newcastlewildflower.com.au/wp-content/uploads/2013/05/9fkUCY02te7bqobeZzdT9SEio1_500.jpg");
add("http://img.ffffound.com/static-data/assets/6/51cc46900bf5fe574293d49c4d9939e0ebfc8ee3_m.jpg");
}
};
}
呃,我们可以有一个视觉表示的工作流程?它很难想象你想达到什么。 – GPuschka
@GPuschka我编辑了我的帖子。正如你所看到的,在屏幕上我们有清单。每个列表项代表:ImageView(在灰色背景中)和另一个列表(ImageView的右侧) –
嗯,我没有看到任何可能会破坏所提供代码逻辑的事情。除了可能执行MediaWithDuplicatesTest。它是如何实现的? – GPuschka