2016-06-21 77 views
1

我有一个适配器用于我的RecyclerView。每个适配器的项目有ImageView和另一个适配器RecyclerView,其中每个项目也有ImageView。我必须点击子项并转到其详细视图。在这个视图中,当我点击REMOVE按钮时,它必须删除这个子项。所以我有几个问题:Android从RecyclerView删除子项目

  1. 我在主适配器,它有两个参数实现方法:在主列表中的位置和在子列表中的位置。这就是我试图去除它。问题是,当我在一个位置删除一个子项时,它会删除另一个位置中的相同子项(我使用假数据,其中一些是相同的)。
  2. 删除一个子项后,当我尝试删除第二个子项时,它不会删除。我已经检查了调试模式,并且看到子项目列表的大小在开始时变得如此。

有我的适配器的代码。在主适配器我有子项的适配器内部类:

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的实例。我究竟做错了什么?

这是它的外观: enter image description here

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"); 
     } 
    }; 
} 
+0

呃,我们可以有一个视觉表示的工作流程?它很难想象你想达到什么。 – GPuschka

+0

@GPuschka我编辑了我的帖子。正如你所看到的,在屏幕上我们有清单。每个列表项代表:ImageView(在灰色背景中)和另一个列表(ImageView的右侧) –

+0

嗯,我没有看到任何可能会破坏所提供代码逻辑的事情。除了可能执行MediaWithDuplicatesTest。它是如何实现的? – GPuschka

回答

1

好的,我们走吧。在私人列表getFakeData()方法您传递相同列表 fakeDuplicates到主适配器中的所有项目。这意味着他们共享底层数据。对其进行的更改反映在从数据创建的所有视图中。把列表的实例化到循环中,看看是否有帮助。

+0

Wow中显示在RecyclerView中。它有助于解决我的第一个问题。谢谢!但第二个问题仍然在这里:( –

+0

试着去观察'private void populateRecyclerViewHolder()'是什么时候以及如何调用的,它应该只被调用一次,但是从代码中看到,描述我的猜测是在它之间的某个地方被调用删除重复。详细视图是一个活性? – GPuschka

+0

细节视图是一个片段 –