如何解决为每个按钮点击添加新按钮和微调器
在用户单击“添加客户端”按钮时的活动中,我想向屏幕添加新视图,其中包含一个带有从 api 检索到的客户端名称列表的微调器和一个将在单击时执行某些操作的按钮。
所以我想我会为此使用回收视图和适配器,但我认为我错了
在活动中我有适配器
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>
用于两个不同的目的:
- 在微调器中可供选择的客户列表
- 要在 RecyclerView 中显示的微调器数量。
这是两个单独的东西,所以你需要两个单独的列表。
,您只需为您的 integer
添加 ClientsAdapter
值即可做到这一点。将其默认值设置为 0 并创建一个更改其值的方法。当您要添加新项目(新 Spinner
和 Button
)时,请使用该方法并通知您的适配器。
为您的 count
添加一个名为 ClientsAdapter
的新字段。
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);
});
注意:我不明白您为什么要为 podAdapter
设置 RecyclerView
。
clientRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
clientAdapter= new clientAdapter(clientList,this,this);
clientRecyclerView.setAdapter(podAdapter);
您正在为 clientAdapter
创建 ClientsAdapter
引用,但在为 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,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) {
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。