简体   繁体   English

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

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

In the activity when user click on add client button I want to add new view to the screen which contains a spinner with list of client names retrieved from api and a button that will do some action on click.在用户单击添加客户端按钮的活动中,我想向屏幕添加新视图,其中包含一个微调器,其中包含从 api 检索到的客户端名称列表和一个在单击时会执行某些操作的按钮。

So I thought I would use a recycleview and adapter for this but I think I'm wrong所以我想我会为此使用recycleview和适配器,但我认为我错了

in the activity I have the adapter在活动中我有适配器

private ClientAdapter clientAdapter;

When I retrieve clients name from API I set the adapter as当我从 API 检索客户端名称时,我将适配器设置为

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

At this point I don't want the recycle view to render anything until user click on add new client button then I want to display one item that has spinner with client names and a button.在这一点上,我不希望回收视图呈现任何内容,直到用户单击添加新客户端按钮然后我想显示一个具有客户端名称和按钮的微调器的项目。 Then if he clicks again on add client button I want to show another spinner and button and so on.然后,如果他再次单击添加客户端按钮,我想显示另一个微调器和按钮等等。

However now I'm having 3 clients so recycleview render 3 view items which make sense.但是现在我有 3 个客户端,所以 recycleview 渲染了 3 个有意义的视图项。 But what the trick that I should do to achieve my goal?但是我应该做些什么来实现我的目标呢?

在此处输入图像描述

Here's my adapter这是我的适配器

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

and here's my list item这是我的清单项目

From comments:来自评论:

The problem is I'm passing list of clients to the adapter (size of 3) then the adapter render 3 items.问题是我将客户端列表传递给适配器(大小为 3),然后适配器呈现 3 个项目。 I don't want this behavior I want to have 0 item if user click on add I will render one item and so on我不希望这种行为如果用户单击添加,我希望有 0 个项目我将呈现一个项目,依此类推

You are using a single ArrayList<Client> for two different purposes:您将单个ArrayList<Client>用于两个不同的目的:

  1. The list of clients to choose from in the spinner微调器中可供选择的客户列表
  2. The number of spinners to display in the RecyclerView.在 RecyclerView 中显示的微调器数量。

These are two separate things, so you need two separate lists.这是两个不同的东西,所以你需要两个不同的列表。

You can do that with just adding integer value for your ClientsAdapter .您只需为您的ClientsAdapter添加integer值即可。 Set its default value as 0 and create a method for changing it's value.将其默认值设置为 0 并创建一个更改其值的方法。 When you want to add new item (new Spinner and Button ) use that method and notify your adapter.当您想添加新项目(新SpinnerButton )时,请使用该方法并通知您的适配器。

Add a new field called count for your ClientsAdapter .为您的ClientsAdapter添加一个名为count的新字段。

private int count;    

Inside constructor assign its value to 0. So on start its value will be 0 and RecyclerView will show nothing.在构造函数内部将其值分配给 0。所以在开始时它的值将为 0,并且RecyclerView将不显示任何内容。

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

Change getItemCount method's return value.更改getItemCount方法的return值。 According to your code getItemCount returns size of your List .根据您的代码getItemCount返回您的List的大小。 That List is for Spinner and has no relation with this method.List适用于Spinner ,与此方法无关。 Instead of returning your List 's size return count .而不是返回您的List的大小返回count

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

Create a method for changing count 's value.创建一个更改count值的方法。 count starts with 0 (assigned it 0 inside constructor) and when you click Button (add new Spinner and Button ) this method will change its value. count从 0 开始(在构造函数中为其分配 0),当您单击Button (添加新的SpinnerButton )时,此方法将更改其值。

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

Whenever you click Button simply call addItem method and pass new count value and notify your clientAdapter .每当您单击Button时,只需调用addItem方法并传递新的count数值并通知您的clientAdapter

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

NOTE: I don't get it why you're setting podAdapter for RecyclerView .注意:我不明白您为什么要为RecyclerView设置podAdapter

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

You're creating clientAdapter reference for your ClientsAdapter but while setting adapter for RecyclerView , you're using different reference ( podAdapter ).您正在为您的ClientsAdapter创建clientAdapter引用,但是在为RecyclerView设置适配器时,您使用的是不同的引用( podAdapter )。

Full code for ClientsAdapter : 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