Android - 当我使用 searchview 时,列表视图没有更新

Android - The listview is not updating when I use searchview

提问人:cyla1234 提问时间:10/24/2023 更新时间:10/24/2023 访问量:45

问:

我是Android Studio的新手,有人可以帮我解决我的问题吗?使用 searchview 后,当我删除列表视图中的项目时,它不会更新。

让我给你截图,以便更好地可视化问题

这是应用程序的外观

过滤器工作,它显示柠檬

使用 searchview 后,我尝试删除带有 toast 消息的 Lemon,但它仍然在列表视图中

  1. 这是我到目前为止一直在做的事情

主要活动.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;
    }
}
java android listview searchview

评论


答:

0赞 Stephan 10/24/2023 #1

您可以从原始列表中删除该项目,但不会删除 .因此,即使在调用 之后,该项目仍位于列表中。狐狸ArrayAdapternotifyDataSetChanged

...
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;
    }

希望能帮到你, 谢福克斯。