繁体   English   中英

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

[英]Adding new button and spinner for each button click

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

所以我想我会为此使用recycleview和适配器,但我认为我错了

在活动中我有适配器

private ClientAdapter clientAdapter;

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

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

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

但是现在我有 3 个客户端,所以 recycleview 渲染了 3 个有意义的视图项。 但是我应该做些什么来实现我的目标呢?

在此处输入图像描述

这是我的适配器

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 中显示的微调器数量。

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

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

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

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

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

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

您正在为您的ClientsAdapter创建clientAdapter引用,但是在为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, EventListener listener , 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) {
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM