Android 从RecyclerView获取子位置的ExpandableListView

Android 从RecyclerView获取子位置的ExpandableListView,android,android-recyclerview,Android,Android Recyclerview,我跟踪了这个链接 了解如何从“回收器”视图执行可展开列表视图 一切都很好,但现在我想点击孩子,它将进入下一页并显示文本 例如,我点击汽车(标题)->奥迪(儿童)->进入下一页并打印奥迪 我读了资料来源,最后几句说 The advantage of RecyclerView is that it doesn't have onItemClickListener, so the click events will be directly supplied to the child. 那么,我如

我跟踪了这个链接 了解如何从“回收器”视图执行可展开列表视图

一切都很好,但现在我想点击孩子,它将进入下一页并显示文本

例如,我点击汽车(标题)->奥迪(儿童)->进入下一页并打印奥迪

我读了资料来源,最后几句说

 The advantage of RecyclerView is that it doesn't have onItemClickListener, so the click events will be directly supplied to the child. 

那么,我如何为孩子实现一个监听器呢?

基本上,您需要将监听器(从活动/片段)传递给
适配器。我稍微改变了一下谷歌的基本例子

请参见下面的代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private RecyclerView recyclerview;
    private List<ExpandableListAdapter.Item> data;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
        recyclerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        data = new ArrayList<>();

        data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.HEADER, "Fruits"));
        data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, "Apple"));
        data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, "Orange"));
        data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, "Banana"));
        data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.HEADER, "Cars"));
        data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, "Audi"));
        data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, "Aston Martin"));
        data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, "BMW"));
        data.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, "Cadillac"));

        ExpandableListAdapter.Item places = new ExpandableListAdapter.Item(ExpandableListAdapter.HEADER, "Places");
        places.invisibleChildren = new ArrayList<>();
        places.invisibleChildren.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, "Kerala"));
        places.invisibleChildren.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, "Tamil Nadu"));
        places.invisibleChildren.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, "Karnataka"));
        places.invisibleChildren.add(new ExpandableListAdapter.Item(ExpandableListAdapter.CHILD, "Maharashtra"));

        data.add(places);

        recyclerview.setAdapter(new ExpandableListAdapter(data,this));
    }

    @Override
    public void onClick(View view) {

        int position = (Integer)view.getTag();

        Toast.makeText(view.getContext(), "position=" + position + " clicked on" + data.get(position).text, Toast.LENGTH_SHORT).show();


    }

}
public类MainActivity扩展AppCompatActivity实现View.OnClickListener{
私人回收站;
私人名单数据;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerview=(recyclerview)findViewById(R.id.recyclerview);
setLayoutManager(新的LinearLayoutManager(此,LinearLayoutManager.VERTICAL,false));
数据=新的ArrayList();
添加(新的ExpandableListAdapter.Item(ExpandableListAdapter.HEADER,“水果”);
添加(新的ExpandableListAdapter.Item(ExpandableListAdapter.CHILD,“Apple”);
添加(新的ExpandableListAdapter.Item(ExpandableListAdapter.CHILD,“橙色”);
添加(新的ExpandableListAdapter.Item(ExpandableListAdapter.CHILD,“香蕉”);
添加(新的ExpandableListAdapter.Item(ExpandableListAdapter.HEADER,“Cars”);
添加(新的ExpandableListAdapter.Item(ExpandableListAdapter.CHILD,“aud”));
添加(新的ExpandableListAdapter.Item(ExpandableListAdapter.CHILD,“Aston Martin”);
添加(新的ExpandableListAdapter.Item(ExpandableListAdapter.CHILD,“BMW”);
添加(新的ExpandableListAdapter.Item(ExpandableListAdapter.CHILD,“Cadillac”);
ExpandableListAdapter.Item places=新的ExpandableListAdapter.Item(ExpandableListAdapter.HEADER,“places”);
places.invisibleChildren=新的ArrayList();
places.invisibleChildren.add(新的ExpandableListAdapter.Item(ExpandableListAdapter.CHILD,“Kerala”);
places.invisibleChildren.add(新的ExpandableListAdapter.Item(ExpandableListAdapter.CHILD,“泰米尔纳德邦”);
places.invisibleChildren.add(新的ExpandableListAdapter.Item(ExpandableListAdapter.CHILD,“卡纳塔克邦”);
places.invisibleChildren.add(新的ExpandableListAdapter.Item(ExpandableListAdapter.CHILD,“马哈拉施特拉邦”);
数据。添加(位置);
setAdapter(新的ExpandableListAdapter(数据,this));
}
@凌驾
公共void onClick(视图){
int position=(整数)view.getTag();
Toast.makeText(view.getContext(),“position=“+position+”单击“+data.get(position).text,Toast.LENGTH_SHORT).show();
}
}
适配器

public class ExpandableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static final int HEADER = 0;
    public static final int CHILD = 1;

    private List<Item> data;
    private View.OnClickListener _listener;

    public ExpandableListAdapter(List<Item> data, View.OnClickListener listener) {
        this.data = data;
        _listener = listener;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
        View view = null;
        Context context = parent.getContext();
        float dp = context.getResources().getDisplayMetrics().density;
        int subItemPaddingLeft = (int) (18 * dp);
        int subItemPaddingTopAndBottom = (int) (5 * dp);
        switch (type) {
            case HEADER:
                LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.list_header, parent, false);
                ListHeaderViewHolder header = new ListHeaderViewHolder(view);
                return header;
            case CHILD:
                TextView itemTextView = new TextView(context);
                itemTextView.setPadding(subItemPaddingLeft, subItemPaddingTopAndBottom, 0, subItemPaddingTopAndBottom);
                itemTextView.setTextColor(0x88000000);
                itemTextView.setLayoutParams(
                        new ViewGroup.LayoutParams(
                                ViewGroup.LayoutParams.MATCH_PARENT,
                                ViewGroup.LayoutParams.WRAP_CONTENT));
                return new RecyclerView.ViewHolder(itemTextView) {
                };
        }
        return null;
    }

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final Item item = data.get(position);
        switch (item.type) {
            case HEADER:
                final ListHeaderViewHolder itemController = (ListHeaderViewHolder) holder;
                itemController.refferalItem = item;
                itemController.header_title.setText(item.text);
                if (item.invisibleChildren == null) {
                    itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus);
                } else {
                    itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus);
                }
                itemController.btn_expand_toggle.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (item.invisibleChildren == null) {
                            item.invisibleChildren = new ArrayList<Item>();
                            int count = 0;
                            int pos = data.indexOf(itemController.refferalItem);
                            while (data.size() > pos + 1 && data.get(pos + 1).type == CHILD) {
                                item.invisibleChildren.add(data.remove(pos + 1));
                                count++;
                            }
                            notifyItemRangeRemoved(pos + 1, count);
                            itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus);
                        } else {
                            int pos = data.indexOf(itemController.refferalItem);
                            int index = pos + 1;
                            for (Item i : item.invisibleChildren) {
                                data.add(index, i);
                                index++;
                            }
                            notifyItemRangeInserted(pos + 1, index - pos - 1);
                            itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus);
                            item.invisibleChildren = null;
                        }
                    }
                });
                break;
            case CHILD:
                TextView itemTextView = (TextView) holder.itemView;
                itemTextView.setText(data.get(position).text);
                itemTextView.setTag(position);
                itemTextView.setOnClickListener(_listener);
                break;
        }
    }

    @Override
    public int getItemViewType(int position) {
        return data.get(position).type;
    }

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

    private static class ListHeaderViewHolder extends RecyclerView.ViewHolder {
        public TextView header_title;
        public ImageView btn_expand_toggle;
        public Item refferalItem;

        public ListHeaderViewHolder(View itemView) {
            super(itemView);
            header_title = (TextView) itemView.findViewById(R.id.header_title);
            btn_expand_toggle = (ImageView) itemView.findViewById(R.id.btn_expand_toggle);
        }
    }



    public static class Item {
        public int type;
        public String text;
        public List<Item> invisibleChildren;

        public Item() {
        }

        public Item(int type, String text) {
            this.type = type;
            this.text = text;
        }
    }
}
公共类ExpandableListAdapter扩展了RecyclerView.Adapter{ 公共静态最终整数头=0; 公共静态final int CHILD=1; 私人名单数据; private View.OnClickListener\u listener; 公共ExpandableListAdapter(列表数据,View.OnClickListener侦听器){ 这个数据=数据; _监听器=监听器; } @凌驾 public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int类型){ 视图=空; Context=parent.getContext(); float dp=context.getResources().getDisplayMetrics().density; int子项paddingleft=(int)(18*dp); int子项paddingtopandbooth=(int)(5*dp); 开关(类型){ 案例标题: LayoutFlater充气器=(LayoutFlater)parent.getContext().getSystemService(Context.LAYOUT\u充气器\u服务); 视图=充气机。充气(R.layout.list_标题,父项,false); ListHeaderServiceWholder头=新的ListHeaderServiceWholder(视图); 返回头; 个案儿童: TextView itemTextView=新的TextView(上下文); setPadding(subItemPaddingLeft,subItemPaddingTopAndBottom,0,subItemPaddingTopAndBottom); itemTextView.setTextColor(0x88000000); itemTextView.setLayoutParams( 新建ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_父级, ViewGroup.LayoutParams.WRAP_CONTENT); 返回新的RecyclerView.ViewHolder(itemTextView){ }; } 返回null; } BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){ 最终项目=data.get(位置); 开关(项目类型){ 案例标题: 最终ListHeaderServiceWholder项目控制器=(ListHeaderServiceWholder)持有者; itemController.refferalItem=项目; itemController.header\u title.setText(item.text); if(item.invisibleChildren==null){ itemController.btn_expand_toggle.setImageResource(R.drawable.circle_减号); }否则{ itemController.btn\u expand\u toggle.setImageResource(R.drawable.circle\u plus); } itemController.btn\u expand\u toggle.setOnClickListener(新视图.OnClickListener()){ @凌驾 公共void onClick(视图v){ if(item.invisibleChildren==null){ item.invisibleChildren=新的ArrayList(); 整数计数=0; int pos=data.indexOf(itemController.refferalItem); while(data.size()>pos+1&&data.get(pos+1).type==CHILD){ item.invisibleChildren.add(data.remove(位置+1));