[英]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>
用於兩個不同的目的:
這是兩個不同的東西,所以你需要兩個不同的列表。
您只需為您的ClientsAdapter
添加integer
值即可。 將其默認值設置為 0 並創建一個更改其值的方法。 當您想添加新項目(新Spinner
和Button
)時,請使用該方法並通知您的適配器。
為您的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
(添加新的Spinner
和Button
)時,此方法將更改其值。
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.