[英]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.