繁体   English   中英

父级RecyclerView单击事件的子级RecyclerView项

[英]Items of Child RecyclerView of parent RecyclerView click event

我有一个显示项目列表的回收站视图。 每个项目中都有一个标题和另一个RecyclerView,用于显示项目列表。

我想访问子RecyclerView项的单击事件。

布局的屏幕截图:

布局预览

父级RecyclerView:

public class DetailsGroupAdapter extends RecyclerView.Adapter<DetailsGroupAdapter.ViewHolder>{
private static OnItemClickListener listener;
private Context context;
private int lastPosition = -1;
RecyclerView mRecyclerView;

public interface OnItemClickListener {
    void onItemClick(View itemView, int position);
    void onGroupItemLongClick(View itemView, int groupPosition, int itemPosition);
    void onGroupItemClick(View itemView, int groupPosition, int itemPosition);
}

public void setOnItemClickListener(OnItemClickListener listener) {
    DetailsGroupAdapter.listener = listener;
}

public static class ViewHolder extends RecyclerView.ViewHolder {

    public TextView tvTitle;
    public CardView cvContainer;
    public RecyclerView rvItems;

    public ViewHolder(final View itemView)
    {
        super(itemView);
        tvTitle = itemView.findViewById(R.id.group_title);
        cvContainer = itemView.findViewById(R.id.container);
        rvItems = itemView.findViewById(R.id.rv_group_items);
        //click listener setup
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Triggers click upwards to the adapter on click
                if (listener != null)
                    listener.onItemClick(itemView, getLayoutPosition());
            }
        });
    }

    public void clearAnimation()
    {
        cvContainer.clearAnimation();
    }
}

private List<DetailsGroup> itemList;

public DetailsGroupAdapter(List<DetailsGroup> itemList)
{
    this.itemList = itemList;
}

@Override
public DetailsGroupAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
    context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);
    View layoutView = inflater.inflate(R.layout.item_details_group, parent, false);
    mRecyclerView = (RecyclerView) parent;
    return new ViewHolder(layoutView);
}

@Override
public void onBindViewHolder(final DetailsGroupAdapter.ViewHolder viewHolder, int groupPosition){
    final DetailsGroup detailsGroup = itemList.get(groupPosition);
    if(detailsGroup.Title != null){
        viewHolder.tvTitle.setText(detailsGroup.Title);
    } else {
        viewHolder.tvTitle.setVisibility(View.GONE);
    }

    final DetailsGroupItemsAdapter detailsGroupAdapter = new DetailsGroupItemsAdapter(detailsGroup.itemsList, groupPosition);

    detailsGroupAdapter.setOnItemClickListener(new DetailsGroupItemsAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(View itemView, int position) {
            if (listener != null){
                listener.onGroupItemClick(itemView, (int) itemView.getTag(), position);
            }
        }
        @Override
        public void onLongClick(View itemView, int position) {
            if (listener != null){
                listener.onGroupItemLongClick(itemView, (int) itemView.getTag(), position);
            }
        }
    });

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context) {};
    viewHolder.rvItems.setLayoutManager(linearLayoutManager);
    viewHolder.rvItems.setAdapter(detailsGroupAdapter);
}

private void setAnimation(View viewToAnimate, int position)
{
    if (position > lastPosition) {
        AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f);
        anim.setDuration(1000);
        viewToAnimate.startAnimation(anim);
        lastPosition = position;
    }
}

@Override
public void onViewDetachedFromWindow(final ViewHolder holder)
{
    ((ViewHolder)holder).cvContainer.clearAnimation();
}

@Override
public long getItemId(int position) {
    return itemList.get(position).hashCode();
}

@Override
public int getItemCount()
{
    return itemList.size();
}

public void clear() {
    itemList.clear();
    notifyDataSetChanged();
}

public void addAll(List<DetailsGroup> list){
    itemList.addAll(list);
    notifyDataSetChanged();
}

}

子RecyclerView:

public class DetailsGroupItemsAdapter extends RecyclerView.Adapter<DetailsGroupItemsAdapter.ViewHolder>{
private static OnItemClickListener listener;
private Context context;
private int lastPosition = -1;
private int groupPosition;
public interface OnItemClickListener {
    void onItemClick(View itemView, int position);
    void onLongClick(View itemView,int position);
}

public void setOnItemClickListener(OnItemClickListener listener) {
    DetailsGroupItemsAdapter.listener = listener;
}

public static class ViewHolder extends RecyclerView.ViewHolder {

    public TextView tvTitle;
    public TextView tvSubTitle;
    public ImageView ivThumbnail;
    public LinearLayout llContainer;

    public ViewHolder(final View itemView)
    {
        super(itemView);
        ivThumbnail = itemView.findViewById(R.id.thumbnail);
        tvTitle = itemView.findViewById(R.id.title);
        tvSubTitle = itemView.findViewById(R.id.subtitle);
        llContainer = itemView.findViewById(R.id.container);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null)
                    listener.onItemClick(itemView, getLayoutPosition());
            }
        });

        itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                if (listener != null)
                    listener.onLongClick(itemView, getLayoutPosition());
                return false;
            }
        });
    }

    public void clearAnimation()
    {
        llContainer.clearAnimation();
    }
}

private List<ItemDetail> itemList;

public DetailsGroupItemsAdapter(List<ItemDetail> itemList, int groupPosition)
{
    this.itemList = itemList;
    this.groupPosition = groupPosition;
}

@Override
public DetailsGroupItemsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
    context = parent.getContext();
    LayoutInflater inflater = LayoutInflater.from(context);
    View layoutView = inflater.inflate(R.layout.item_details, parent, false);
    return new ViewHolder(layoutView);
}

@Override
public void onBindViewHolder(DetailsGroupItemsAdapter.ViewHolder viewHolder, int position){
    viewHolder.itemView.setTag(groupPosition);

    ItemDetail itemDetail = itemList.get(position);

    if(itemDetail.Title != null){
        viewHolder.tvTitle.setText(itemDetail.Title);
    } else {
        viewHolder.tvTitle.setVisibility(View.GONE);
    }

    if(itemDetail.Sub_Title != null){
        viewHolder.tvSubTitle.setText(itemDetail.Sub_Title);
    } else {
        viewHolder.tvSubTitle.setVisibility(View.GONE);
    }

    if(itemDetail.Thumbnail_Enabled){
        PicManipulationUtility.SetGenericPictureFromThumbnailType(viewHolder.ivThumbnail, itemDetail.Thumbnail_Type, itemDetail.Thumbnail);
    } else {
        viewHolder.ivThumbnail.setVisibility(View.GONE);
    }

    setAnimation(viewHolder.llContainer, position);
}

private void setAnimation(View viewToAnimate, int position)
{
    if (position > lastPosition) {
        AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f);
        anim.setDuration(1000);
        viewToAnimate.startAnimation(anim);
        lastPosition = position;
    }
}

@Override
public void onViewDetachedFromWindow(final ViewHolder holder)
{
    ((ViewHolder)holder).llContainer.clearAnimation();
}

@Override
public long getItemId(int position) {
    return itemList.get(position).hashCode();
}

@Override
public int getItemCount()
{
    return itemList.size();
}

public void clear() {
    itemList.clear();
    notifyDataSetChanged();
}

public void addAll(List<ItemDetail> list){
    itemList.addAll(list);
    notifyDataSetChanged();
}
}

使用的类:ItemDetail和DetailsGroup是POJO,用于将JSON转换为对象。

到目前为止,我暂时无法解决的问题是:

  1. 在父级RecyclerView的onBindViewHolder中,我抓住了组的位置。
  2. 然后我将父级的组位置传递给(DetailsGroupItemsAdapter)中的子级适配器初始化程序
  3. 最后,在子onBindViewHolder中,将标签设置为父组位置(viewHolder.itemView.setTag(groupPosition);)

因此,在孩子的点击事件中,我可以说:

listener.onGroupItemClick(itemView, (int) itemView.getTag(), position);

因此,在我的“活动”或“片段”中的冒泡事件中同时具有组位置和子位置。

但是我可以肯定,通过的组位置可以由于任何原因而改变,例如更新组项目或删除项目。 我想知道在这种情况下是否有更强大的解决方案来实现嵌套项目的click事件。

我使用了这个https://gist.github.com/riyazMuhammad/1c7b1f9fa3065aa5a46f ,尤其是

CustomItemClickListener.java

public interface CustomItemClickListener {
    public void onItemClick(View v, int position);
}

(父)RecyclerView修改:

public class ItemsListAdapter extends RecyclerView.Adapter<ItemsListAdapter.ViewHolder> {
    ArrayList<ItemListSingleItem> data;

    Context mContext;
    CustomItemClickListener listener;

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.items_list_single_item, parent, false);
        final ViewHolder mViewHolder = new ViewHolder(mView);
        mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onItemClick(v, mViewHolder.getPosition());
            }
        });
        return mViewHolder;
    }

//[... the other "classical" parts of your code...]

}
  • 独自一人,这使我可以分别对孩子和父母进行点击事件

  • 我认为,通过一些修改,它使我得到了类似于您的“修复”的内容,但也许会为您提供一些线索:在构造它时,我将给孩子一个父位置和父侦听器,然后单击在子级上产生与在父级上单击相同的行为

RecyclerView构造函数:

public AppsAdapter(ArrayList<PackageInformation.InfoObject> dataSet, CustomOnItemClickListener customItemClickListener, int parentPos) {
    appsDataSet = dataSet;
    onItemClickListener = customItemClickListener;
    parentPosition = parentPos;
}

子级RecyclerView onCreateViewHolder

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

    // Create a new view.
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_app, viewGroup, false);

    // Create the ViewHolder to return
    final AppsAdapter.ViewHolder mViewHolder = new AppsAdapter.ViewHolder(v);

    // Add the Listener
    v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) { onItemClickListener.onItemClick(v, parentPosition); }
    });

    return mViewHolder;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM