为每个按钮点击添加新按钮和微调器

问题描述

用户单击“添加客户端”按钮时的活动中,我想向屏幕添加新视图,其中包含一个带有从 api 检索到的客户端名称列表的微调器和一个将在单击时执行某些操作的按钮。

所以我想我会为此使用回收视图和适配器,但我认为我错了

在活动中我有适配器

private ClientAdapter clientAdapter;

当我从 API 检索客户端名称时,我将适配器设置为

   clientRecyclerView.setLayoutManager(new linearlayoutmanager(getApplicationContext()));
   clientAdapter= new clientAdapter(clientList,this,this);
   clientRecyclerView.setAdapter(podAdapter);

此时我不希望回收视图呈现任何内容,直到用户单击添加新客户端按钮然后我想显示一个带有客户端名称和按钮的微调器的项目。 然后,如果他再次单击添加客户端按钮,我想显示一个微调器和按钮等等。

但是现在我有 3 个客户端,因此 recycleview 呈现 3 个有意义的视图项。 但是我应该做什么来实现我的目标?

enter image description here

这是我的适配器

public class ClintsAdapter extends RecyclerView.Adapter<ClintsAdapter.ViewHolder> {

    private List<Clients> clientsList;
    private EventListener listener;


    public ClintsAdapter(List<Clients> clientsList,EventListener listener,Context context) {
        this.clientsList = clientsList;
        this.EventListener = listener;
    }

    @NonNull
    @Override // To inflate view
    public ClintsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem_client,parent,false);
        ViewHolder viewHolder = new ViewHolder(view,listener);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ClintsAdapter.ViewHolder holder,int position) {
        ClintsAdapter = new ArrayAdapter<Client>(context,R.layout.spinner_text_view,clientsList);
        ClintsAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        holder.clientSpinner.setAdapter(ClintsAdapter);
        holder.clientSpinner.setTitle("Choose client");
    }

    @Override
    public int getItemCount() {
        if (clientsList == null)
            return 0;
        return clientsList.size();
    }

    public interface PODListener {
        void onClick(int position);
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private SearchableSpinner clientSpinner,collectMethodSpinner;

        EventListener listener;

        public ViewHolder(View itemView,final EventListener listener) {
            super(itemView);
            this.listener = podListener;
            clientSpinner = itemView.findViewById(R.id.spinner_client);
            btnComment = itemView.findViewById(R.id.btn_comment);

            btnComment.setonClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if ( listener != null ) {
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION){
                            listener.onClick(position);
                        }
                    }

                }
            });
        }
        @Override
        public void onClick(View v) {
        }
    }
}

这是我的列表项

解决方法

来自评论:

问题是我将客户端列表传递给适配器(大小为 3),然后适配器呈现 3 个项目。我不想要这种行为,如果用户单击添加,我想要 0 个项目,我将呈现一个项目,依此类推

您将一个 ArrayList<Client> 用于两个不同的目的:

  1. 在微调器中可供选择的客户列表
  2. 要在 RecyclerView 中显示的微调器数量。

这是两个单独的东西,所以你需要两个单独的列表。

,

您只需为您的 integer 添加 ClientsAdapter 值即可做到这一点。将其默认值设置为 0 并创建一个更改其值的方法。当您要添加新项目(新 SpinnerButton)时,请使用该方法并通知您的适配器。

为您的 count 添加一个名为 ClientsAdapter 的新字段。

private int count;    

内部构造函数将其值赋值为 0。因此在开始时它的值为 0,而 RecyclerView 将不显示任何内容。

public ClintsAdapter(List<Clients> clientsList,EventListener listener,Context context){
    this.clientsList = clientsList;
    this.EventListener = listener;
    count = 0;
}

更改 getItemCount 方法的 return 值。根据您的代码 getItemCount 返回您的 List 的大小。 List 用于 Spinner,与此方法无关。而不是返回您的 List 的大小返回 count

@Override
public int getItemCount() {
    return count;
}

创建用于更改 count 值的方法。 count 以 0 开头(在构造函数中为其分配了 0),当您单击 Button(添加新的 SpinnerButton)时,此方法将更改其值。

public void addItem(int count) {
    this.count = count;
}

每当您点击 Button 时,只需调用 addItem 方法并传递新的 count 值并通知您的 clientAdapter

addClient.setOnClickListener(v -> {
    int count = clientRecyclerView.getChildCount();
    clientAdapter.addItem(count+1);
    clientAdapter.notifyItemInserted(count);
});

注意:我不明白您为什么要为 podAdapter 设置 RecyclerView

clientRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
clientAdapter= new clientAdapter(clientList,this,this);
clientRecyclerView.setAdapter(podAdapter);

您正在为 clientAdapter 创建 ClientsAdapter 引用,但在为 RecyclerView 设置适配器时,您使用的是不同的引用 (podAdapter)。

ClientsAdapter 的完整代码:

public class ClintsAdapter extends RecyclerView.Adapter<ClintsAdapter.ViewHolder> {

    private List<Clients> clientsList;
    private EventListener listener;
    private int count;


    public ClintsAdapter(List<Clients> clientsList,Context context) {
        this.clientsList = clientsList;
        this.EventListener = listener;
        count = 0;
    }

    @NonNull
    @Override // To inflate view
    public ClintsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem_client,parent,false);
        ViewHolder viewHolder = new ViewHolder(view,listener);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ClintsAdapter.ViewHolder holder,int position) {
        ClintsAdapter = new ArrayAdapter<Client>(context,R.layout.spinner_text_view,clientsList);
        ClintsAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        holder.clientSpinner.setAdapter(ClintsAdapter);
        holder.clientSpinner.setTitle("Choose client");
    }

    public void addItem(int count) {
        this.count = count;
    }    

    @Override
    public int getItemCount() {
        return count;
    }

    public interface PODListener {
        void onClick(int position);
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private SearchableSpinner clientSpinner,collectMethodSpinner;

        EventListener listener;

        public ViewHolder(View itemView,final EventListener listener) {
            super(itemView);
            this.listener = podListener;
            clientSpinner = itemView.findViewById(R.id.spinner_client);
            btnComment = itemView.findViewById(R.id.btn_comment);

            btnComment.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if ( listener != null ) {
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION){
                            listener.onClick(position);
                        }
                    }

                }
            });
        }
        @Override
        public void onClick(View v) {
        }
    }
}