在dropdown(ListView)的下拉框,为每个item添加删除功能的button,并解决itemSelected无法响应的问题...

本文介绍如何解决使用自定义Adapter时dropdown item选择事件无法响应的问题。通过为自定义布局添加onClickListener,实现了item值的正确赋值,并确保button click事件能被成功捕获。
接着上一篇博客,username能够从下拉列表中选择要登录的账号,同时也能删除对应的账号。
出现的问题是:嵌入自定义的item布局之后(自定义的Adapter中的getView方法中实现),发现item的选择事件捕捉不到了,点击dropdown的item之后完全没有响应。

我经过试验后推测导致问题的原因是这样的:在item中嵌入自定义的布局后,item自身作为父容器,就不会截获touch事件,反而传给里面的布局(包括button)来实现。

如果重写该自定义的布局的onTouch方法,使之返回false,那么ItemSelected的事件就会被捕捉到了,不过另一方面,button的click事件就捕捉不到了。(具体关于父子控件之间,touch事件是如何传递的,网上说明的文章很多)

为了解决这个问题,我为整个自定义布局(例如最外)添加了onClickListener,如果点击了就将item中值赋到AutoCompleteTextView中,button的click事件也能成功另外捕获。

好的,上一下效果图:
[img]http://dl.iteye.com/upload/attachment/293006/c06b62ec-ba76-3737-94f3-241e015b8ec5.png[/img]

选择item之后:
[img]http://dl.iteye.com/upload/attachment/293008/3feb6801-a0be-3edf-9bd9-11a7c61440b5.jpg[/img]

点击删除按钮:
[img]http://dl.iteye.com/upload/attachment/293010/5e8dcc4d-e03c-3ebc-9947-0213483bbcf6.jpg[/img]

删除之后:
[img]http://dl.iteye.com/upload/attachment/293012/085323d9-08c6-3b2c-9b4b-1780201360d0.png[/img]
package com.example.kucun2.ui.bancai; import android.app.AlertDialog; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.example.kucun2.DataPreserver.Data; import com.example.kucun2.R; import com.example.kucun2.Retrofit.RetrofitClient; import com.example.kucun2.Retrofit.RetrofitService; import com.example.kucun2.entity.*; import com.example.kucun2.ui.bancai.Adapter.InventoryAdapter; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.util.ArrayList; import java.util.List; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; public class InventoryFragment extends Fragment implements Data.OnDataChangeListener { private EditText searchEditText; private RecyclerView recyclerView; private InventoryAdapter adapter; private List<Kucun> inventoryList = new ArrayList<>(); private FloatingActionButton fabAdd; @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_kucun_inventory, container, false); // 初始化UI组件 searchEditText = view.findViewById(R.id.search_edittext); recyclerView = view.findViewById(R.id.recycler_view); fabAdd = view.findViewById(R.id.fab_add); // 设置RecyclerView recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); adapter = new InventoryAdapter(inventoryList); recyclerView.setAdapter(adapter); // 设置搜索功能 searchEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { filterInventory(s.toString()); } @Override public void afterTextChanged(Editable s) { } }); // 添加按钮点击事件 fabAdd.setOnClickListener(v -> showAddDialog()); // 加载数据 loadData(); return view; } private void fetchInventoryData(String searchTerm) { RetrofitService service = RetrofitClient.getRetrofitInstance().create(RetrofitService.class); service.getInventory(searchTerm).enqueue(new Callback<List<Kucun>>() { @Override public void onResponse(Call<List<Kucun>> call, Response<List<Kucun>> response) { if (response.isSuccessful() && response.body() != null) { updateInventoryList(response.body()); } } @Override public void onFailure(Call<List<Kucun>> call, Throwable t) { Toast.makeText(getContext(), "加载失败: " + t.getMessage(), Toast.LENGTH_SHORT).show(); } }); } private void filterInventory(String query) { List<Kucun> filtered = new ArrayList<>(); String lowerQuery = query.toLowerCase(); for (Kucun kucun : Data.kucuns().getViewList()) { Bancai bancai = kucun.getBancai(); if (bancai == null) continue; boolean matches = false; // 检查材质名称 if (bancai.getCaizhi() != null && bancai.getCaizhi().getName() != null) { matches |= bancai.getCaizhi().getName().toLowerCase().contains(lowerQuery); } // 检查木皮1名称 if (bancai.getMupi1() != null && bancai.getMupi1().getName() != null) { matches |= bancai.getMupi1().getName().toLowerCase().contains(lowerQuery); } // 检查木皮2名称 if (bancai.getMupi2() != null && bancai.getMupi2().getName() != null) { matches |= bancai.getMupi2().getName().toLowerCase().contains(lowerQuery); } // 检查厚度 if (String.valueOf(bancai.getHoudu()).contains(query)) { matches = true; } if (matches) filtered.add(kucun); } inventoryList.clear(); inventoryList.addAll(filtered); adapter.notifyDataSetChanged(); } private void showAddDialog() { MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(requireContext()); builder.setTitle("添加类型") .setItems(new String[]{"板材", "木皮1", "木皮2", "材质"}, (dialog, which) -> { switch (which) { case 0: showAddBancaiDialog(); break; case 1: showAddMupiDialog(); break; case 2: showAddCaizhiDialog(); break; } }); builder.show(); } private void showAddBancaiDialog() { } private void showAddMupiDialog() { // 类似上面的实现 } private void showAddCaizhiDialog() { // 类似上面的实现 } private void addNewBancai(Bancai bancai) { // 添加新板材 Data.add(bancai); // 创建关联的库存记录 Kucun newKucun = new Kucun(); newKucun.setBancai(bancai); newKucun.setShuliang(0); // 初始库存为0 Data.add(newKucun); Toast.makeText(getContext(), "板材添加成功", Toast.LENGTH_SHORT).show(); } @Override public void onResume() { super.onResume(); Data.addDataChangeListener(this); // 注册数据监听 } @Override public void onPause() { super.onPause(); Data.removeDataChangeListener(this); // 移除数据监听 } @Override public void onDataChanged() { // 数据变化时自动刷新 loadData(); } private void loadData() { // 从全局数据获取库存 List<Kucun> fullList = Data.kucuns().getViewList(); updateInventoryList(fullList); } private void updateInventoryList(List<Kucun> fullList) { inventoryList.clear(); inventoryList.addAll(fullList); adapter.notifyDataSetChanged(); } }
最新发布
06-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值