簡體   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