簡體   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