我点了这个链接http://anandbose.github.io/android_recyclerview_expandablelistview.html 了解如何从回收站视图执行可扩展列表视图。
一切都很好,但现在我想点击孩子,它会转到下一页并显示文字。
例如,我点击了Car(标题) - >奥迪(儿童) - >转到下一页并打印奥迪
我阅读了源代码和最后几句陈述
The advantage of RecyclerView is that it doesn't have onItemClickListener, so the click events will be directly supplied to the child.
如何为孩子实现onItemClickListener?
答案 0 :(得分:0)
基本上你需要传递给Adapter
监听器(来自activity / fragment)。我改变了谷歌的基本例子,
请参阅以下代码
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 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;
}
}
}