Android 如何使我的子项可单击?
事实上,我正在尝试开发一家允许点菜的餐厅 但事实上,我在食物中添加变体时遇到了一些问题。我会更好地解释,我有一个recyclerView“食物”,从中我将物品添加到另一个recyclerView“笔记本”,就像服务员记下了某人点的东西一样 此外,在我的应用程序中,我可以将一些变体添加到添加到笔记本的食物中,换句话说,我已经将比萨饼添加到我的笔记本中,通过变体,我可以将一个名为“大”或“带PEPERONI”的孩子添加到比萨饼中,或者两者兼而有之 为了添加子级,我在适配器中执行了以下操作Android 如何使我的子项可单击?,android,android-recyclerview,parent-child,Android,Android Recyclerview,Parent Child,事实上,我正在尝试开发一家允许点菜的餐厅 但事实上,我在食物中添加变体时遇到了一些问题。我会更好地解释,我有一个recyclerView“食物”,从中我将物品添加到另一个recyclerView“笔记本”,就像服务员记下了某人点的东西一样 此外,在我的应用程序中,我可以将一些变体添加到添加到笔记本的食物中,换句话说,我已经将比萨饼添加到我的笔记本中,通过变体,我可以将一个名为“大”或“带PEPERONI”的孩子添加到比萨饼中,或者两者兼而有之 为了添加子级,我在适配器中执行了以下操作 publi
public class AdapterPTERM extends RecyclerView.Adapter<AdapterPTERM.ExampleViewHolder> {
private List<ItemPTERM> mExampleList;
private final LayoutInflater mInflater;
private OnItemClickListener mListener;
public interface OnItemClickListener{
void onItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
mListener = listener;
}
@NonNull
@Override
public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_pterm,parent,false);
return new ExampleViewHolder(v,mListener);
}
AdapterPTERM(Context context, List<ItemPTERM> exampleList){
mExampleList = exampleList;
mInflater = LayoutInflater.from(context);
}
@Override
public void onBindViewHolder(@NonNull final ExampleViewHolder holder, final int position) {
final ItemPTERM item = mExampleList.get(position);
holder.desc.setText(item.getBtnName());
holder.qta.setText(String.valueOf(item.getQuant()));
holder.variantsContainer.removeAllViews();
// ADDING CHILD HERE
final List<Variant> variants = item.getVariants();
if (variants != null && variants.size() > 0){
for(Variant v : variants){
View vView = mInflater.inflate(R.layout.variant_layout,holder.variantsContainer,false);
TextView nameTV = vView.findViewById(R.id.variant_name);
nameTV.setText(v.getName());
vView.setTag(position);
vView.setOnClickListener(varientClickListener);
holder.variantsContainer.addView(vView);
}
}
// NOT IMPORTANT (CHANGING FIELDS COLOR
if(position % 2 == 0 ){
holder.itemView.setBackgroundColor(Color.parseColor("#C0C0C0"));
}else if(position % 2 == 1){
holder.itemView.setBackgroundColor(Color.parseColor("#D3D3D3"));
}
}
@Override
public int getItemCount() {
return mExampleList.size();
}
public class ExampleViewHolder extends RecyclerView.ViewHolder {
public TextView desc;
public TextView qta;
private LinearLayout variantsContainer;
ExampleViewHolder(View itemView, final OnItemClickListener listener) {
super(itemView);
desc = itemView.findViewById(R.id.Desc);
qta = itemView.findViewById(R.id.Qta);
variantsContainer = itemView.findViewById(R.id.ll_child_items);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(listener != null){
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION){
listener.onItemClick(position);
}
}
}
});
}
}
private View.OnClickListener varientClickListener=new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("VIEW:", "CLICKED");
}
};
public void removeItem(int position) {
mExampleList.remove(position);
notifyItemRemoved(position);
}
}
公共类AdapterTerm扩展了RecyclerView.Adapter
现在,如何在活动中使用onClick?创建一个全局的
OnClickListener
,并将listener设置为所有变量视图
public class AdapterPTERM extends RecyclerView.Adapter<AdapterPTERM.ExampleViewHolder> {
private List<ItemPTERM> mExampleList;
private final LayoutInflater mInflater;
private OnItemClickListener mListener;
View.OnClickListener varientClickListener=new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Click","Called");
}
};
........
}
可以设置多个标记。请参阅
setTag
方法的变体 只需在每个添加的视图上设置OnClickListener
。您可以将数据的标记设置为addedView
@ADM您可以举个例子,您对标记的含义是什么?我刚刚开始使用androidBecause,因为实际上视图可能很多,所以我必须为每个视图创建OnClickListener?事实上,我甚至不知道可以有多少变体,使用expandable recyclerView可以更轻松地实现您正在尝试的功能。这是您在gradle dependency compile'com.bignerdranch.android:expandablerecyclerview:x.x.x中添加的一行代码,这是一个如何工作的示例项目:@JohnKarry您需要了解适配器的实际工作方式:)。只有一个clickListener,它可以处理您的所有项目,因为您将像ADM所说的那样给予它位置。你现在的做法是,最好使用expandable recyclerview或listview来解决这个问题。我如何创建一个全局OnClickListener?我实际上制作了一个名为varientClick的公共界面,并在其中放置了你答案的第一个方法,对吗?是的setTag()
我之所以使用,是因为我们通常需要确定单击的视图的位置。你可以通过标签和其他一些你想要的数据来获取它。除此之外,您还可以尝试使用ExpandableListView
或RecyclerView
。而您答案中的第三种方法必须放在活动中?我刚刚更新了我的问题,说明了我试图对您的代码执行的操作。您能检查一下我做错了什么吗?
List<Variant> variants = item.getVariants();
if (variants != null && variants.size() > 0){
for(Variant v : variants){
View vView = mInflater.inflate(R.layout.variant_layout,holder.variantsContainer,false);
TextView nameTV = vView.findViewById(R.id.variant_name);
nameTV.setText(v.getName());
vView.setTag(position);
vView.setOnClickListener(varientClickListener);
holder.variantsContainer.addView(vView);
}
}
View.OnClickListener varientClickListener=new View.OnClickListener() {
@Override
public void onClick(View v) {
if(v.getTag()!=null){
int position= (int) v.getTag();
// Use position to process data
}
}
};