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