实际上,我正在尝试开发一家允许接受订单的餐厅。
但实际上我在为我的食物添加变体时遇到了一些问题。我会更好地解释,我有一个 recyclerView“FOOD”,我从中将项目添加到另一个 recyclerView“NOTEBOOK”,就像服务员注意到有人点了什么。
另外,在我的应用程序中,我可以向添加到 NOTEBOOK 的 FOOD 添加一些变体,换句话说,我已经将 PIZZA 添加到我的 NOTEBOOK,并且通过变体,我可以向 PIZZA 添加一个名为“BIG”或“WITH”的子项PEPERONI”或两者兼而有之。
为了添加一个 child ,我在我的适配器中做了以下操作
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);
}
}
现在我可以单击我添加的每个子项目,甚至可以添加一个 onSwipe 方法,因为我可以从食物中删除特定变体。
这是我的 recyclerView 与 recyclerView 和 subview 的截图。
现在如何在我的 Activity 中使用 onClick?
最佳答案
创建一个全局 OnClickListener
并为所有变体 View 设置监听器。
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");
}
};
........
}
为每个添加的 View 设置监听器并将位置设置为标签并在单击 View 时将其取回。
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
}
}
};
可以设置多个标签。请参阅 setTag
方法的变体。
关于android - 如何让我的子项目可点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51085632/