有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

子RecyclerView的java项父RecyclerView单击事件

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

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

布局的屏幕截图:

Layout Preview

父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();
}

}

儿童回收视图:

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. 在父RecyclerView的onBindViewHolder中,我占据了组的位置
  2. 然后我把家长的分组位置传给了孩子 (DetailsGroupItemsAdapter)中的适配器初始值设定项
  3. 最后,在子onBindViewHolder中,我将标记设置为父项 组位置(viewHolder.itemView.setTag(groupPosition);)

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

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

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

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


共 (1) 个答案

  1. # 1 楼答案

    我用这个{a1},尤其是

    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;
    }
    

    儿童回收视图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;