首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >父RecyclerView点击事件的子RecyclerView项

父RecyclerView点击事件的子RecyclerView项
EN

Stack Overflow用户
提问于 2018-01-28 18:47:18
回答 1查看 3.5K关注 0票数 1

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

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

布局的屏幕截图:

父RecyclerView:

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

代码语言:javascript
复制
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是将JSON转换为对象的POJO。

到目前为止,我设法暂时解决这个问题的方法是:

  1. 在onBindViewHolder of parent RecyclerView中,我抓取了组位置。
  2. 然后我将父组的组位置向下传递到(DetailsGroupItemsAdapter)
  3. 中的子适配器初始值设定项。最后,在子onBindViewHolder中,我将标记设置为父组set

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

代码语言:javascript
复制
listener.onGroupItemClick(itemView, (int) itemView.getTag(), position);

从而在我的活动或片段中的冒泡事件中同时具有组位置和子位置。

但我可以肯定的是,传递的组位置可能会因为任何原因而改变,例如更新组项目或删除项目。我想知道在这种情况下,是否有更健壮的解决方案来实现嵌套项的单击事件。

EN

回答 1

Stack Overflow用户

发布于 2018-05-28 09:21:04

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

CustomItemClickListener.java

代码语言:javascript
复制
public interface CustomItemClickListener {
    public void onItemClick(View v, int position);
}

(父级) RecyclerView修改:

代码语言:javascript
复制
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构造函数:

代码语言:javascript
复制
public AppsAdapter(ArrayList<PackageInformation.InfoObject> dataSet, CustomOnItemClickListener customItemClickListener, int parentPos) {
    appsDataSet = dataSet;
    onItemClickListener = customItemClickListener;
    parentPosition = parentPos;
}

子RecyclerView onCreateViewHolder

代码语言:javascript
复制
@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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48485491

复制
相关文章

相似问题

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