提问人:cyla1234 提问时间:10/24/2023 更新时间:10/24/2023 访问量:45
Android - 当我使用 searchview 时,列表视图没有更新
Android - The listview is not updating when I use searchview
问:
我是Android Studio的新手,有人可以帮我解决我的问题吗?使用 searchview 后,当我删除列表视图中的项目时,它不会更新。
让我给你截图,以便更好地可视化问题
使用 searchview 后,我尝试删除带有 toast 消息的 Lemon,但它仍然在列表视图中
- 这是我到目前为止一直在做的事情
主要活动.java
public class MainActivity extends AppCompatActivity
{
EditText item, price;
Button add;
ListView listView;
SearchView searchBox;
ArrayList<String> itemList = new ArrayList<>();
ArrayList<String> searchList = new ArrayList<>();
ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
item = findViewById(R.id.edtProdName);
price = findViewById(R.id.edtPrice);
add = findViewById(R.id.btnAdd);
listView = findViewById(R.id.list);
searchBox = findViewById(R.id.searchView);
itemList = FileHelper.readData(this);
arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1, itemList);
listView.setAdapter(arrayAdapter);
add.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
String prodName = item.getText().toString();
String prodPrice = price.getText().toString();
String product = prodName.toUpperCase() + " " + "P" + prodPrice.toUpperCase();
itemList.add(product);
item.setText("");
price.setText("");
FileHelper.writeData(itemList,getApplicationContext());
arrayAdapter.notifyDataSetChanged();
Collections.sort(itemList);
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
alert.setTitle("Delete");
alert.setMessage("Do you want to delete this product from the list?");
alert.setCancelable(false);
alert.setNegativeButton("No", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog.cancel();
}
});
alert.setPositiveButton("Yes", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
itemList.remove(position);
FileHelper.writeData(itemList, getApplicationContext());
arrayAdapter.notifyDataSetChanged();
Toast.makeText(MainActivity.this, "Deleted successfully", Toast.LENGTH_SHORT).show();
}
});
AlertDialog alertDialog = alert.create();
alertDialog.show();
}
});
searchBox.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText)
{
arrayAdapter.getFilter().filter(newText);
return false;
}
});
}
}
FileHelper.Java(它允许我将数据保存在我的设备内存中)
public class FileHelper
{
public static final String FILENAME = "listinfo.dat";
public static void writeData(ArrayList<String> item, Context context)
{
try
{
FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oas = new ObjectOutputStream(fos);
oas.writeObject(item);
oas.close();
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static ArrayList<String> readData(Context context)
{
ArrayList<String> itemList = null;
try
{
FileInputStream fis = context.openFileInput(FILENAME);
ObjectInputStream ois = new ObjectInputStream(fis);
itemList = (ArrayList<String>) ois.readObject();
}
catch (FileNotFoundException e)
{
itemList = new ArrayList<>();
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
return itemList;
}
}
答:
0赞
Stephan
10/24/2023
#1
您可以从原始列表中删除该项目,但不会删除 .因此,即使在调用 之后,该项目仍位于列表中。狐狸ArrayAdapter
notifyDataSetChanged
...
String itemToRemove = itemList.remove(position);
arrayAdapter.remove(itemToRemove);
arrayAdapter.notifyDataSetChanged();
...
在正按钮回调中。
1赞
ShayFox
10/24/2023
#2
嗨,即使我无法解释为什么这不起作用,我们也可以用不同的方式解决这个问题。
- ArraysAdapters 可能是反复无常的,您可以重置它,但这不是最好的方法。
- 您可以使用新的类扩展 BaseAdapter 在适配器上创建
这举例说明了如何做到这一点:
public class CustomAdapter extends BaseAdapter {
ArrayList<String> itemList = new ArrayList<>();
@Override
public int getCount() {
return itemList.size();
}
@Override
public Object getItem(int i) {
return itemList.get(i)
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = inflater.inflate(android.R.layout.simple_list_item_1, null);
String item = itemList.get(i);
TextView textview = view.findViewById(android.R.id.text1);
textview.setText(item);
return view;
}
希望能帮到你, 谢福克斯。
评论