如何使用 onClick 按钮从 ListView 中删除所有内容?

How to remove everything from ListView using a button onClick?

如何使用 onClick 按钮从 ListView 中删除所有内容?当我尝试“fullCourseList.clear();”时,我无法再添加任何课程,只有在再次访问页面后才会刷新页面

import static com.example.diplom.MainActivity.fullCourseList;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.example.diplom.model.Course;
import com.example.diplom.model.Order;

import java.util.ArrayList;
import java.util.List;

public class OrderPage extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order_page);

        ListView orders_list = findViewById(R.id.orders_list);

        List<String> coursesTitle = new ArrayList<>();
        for (Course c : MainActivity.fullCourseList) {
            if(Order.items_id.contains(c.getId()))
                coursesTitle.add(c.getTitle());

        }

        orders_list.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, coursesTitle));


    }

    public void openMain(View view){
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(intent);
    }
    public void onClick(View v) {
        //fullCourseList.clear();
    }
}

清除 ArrayList 后,您必须通知适配器数据源已更改。

public class OrderPage extends AppCompatActivity {
    
    private ListView orders_list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order_page);
        orders_list = findViewById(R.id.orders_list);
        List<String> coursesTitle = new ArrayList<>();
        for (Course c : MainActivity.fullCourseList) {
            if(Order.items_id.contains(c.getId()))
                coursesTitle.add(c.getTitle());
        }
        orders_list.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, coursesTitle));
    }

    public void openMain(View view){
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(intent);
    }
    public void onClick(View v) {
        fullCourseList.clear();
        orders_list.getAdapter().notifyDataSetChanged();
    }
}

您应该保存适配器,以便可以在其上调用 clear()。以这种方式清除列表也会自动通知适配器进行更新。由于您将数据复制到新列表 (coursesTitle),因此清除原始列表不会立即生效。

例如:

public class OrderPage extends AppCompatActivity {
    
    private ListView orders_list;
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order_page);
        orders_list = findViewById(R.id.orders_list);
        List<String> coursesTitle = new ArrayList<>();
        for (Course c : MainActivity.fullCourseList) {
            if(Order.items_id.contains(c.getId()))
                coursesTitle.add(c.getTitle());
        }
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, coursesTitle)
        orders_list.setAdapter(adapter);
    }

    public void onClick(View v) {
        adapter.clear();
    }
}

编辑

如果您想要从主列表中清除当前显示的课程项目,您也需要添加这样的代码。如果这不是您想要的,您需要在关于所需行为的问题中更加清楚。

public void onClick(View v) {
    // clear what is currently shown in the list
    adapter.clear();

    // Clear the currently displayed entries out of the master list.
    // You may also be able to use "removeIf" if you have a new
    // enough java/api version
    Iterator<Course> itr = MainActivity.fullCourseList.iterator();
    while (itr.hasNext()) {
        Course c = itr.next();
        if(Order.items_id.contains(c.getId())) {
            itr.remove();
        }
    }

    // And if you want to ENTIRELY clear the master list, you
    // could just do this instead
    // MainActivity.fullCourseList.clear()
}
        

一切都比我想象的要容易,我把自己弄糊涂了自己的 class 名字。非常感谢大家的帮助! 这有效:

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;


import android.widget.ArrayAdapter;;
import android.widget.ListView;

import com.example.diplom.model.Course;
import com.example.diplom.model.Order;

import java.util.ArrayList;

import java.util.List;

public class OrderPage extends AppCompatActivity {

    private ListView orders_list;
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order_page);
        orders_list = findViewById(R.id.orders_list);
        List<String> coursesTitle = new ArrayList<>();
        for (Course c : MainActivity.fullCourseList) {
            if(Order.items_id.contains(c.getId()))
                coursesTitle.add(c.getTitle());
        }
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, coursesTitle);
        orders_list.setAdapter(adapter);

    }

    public void onClick(View v) {
        adapter.clear();
        Order.items_id.clear();
    }
    public void openMain(View view){
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        startActivity(intent);
    }

}