2

我在自定义工具栏中有一个 SearchView 应该过滤适配器,但是在我调用 notifyDataSetChanged() 后适配器没有更新

我的适配器类(相关位):

public class RaffleAdapter extends ArrayAdapter<Raffle> implements Filterable {

    private int mLayoutResourceID;
    private final SQLiteDatabase mDB;
    private Context mContext;
    private RaffleAdapter adapter = this;
    private ArrayList<Raffle> raffles, rafflesFiltered;
    RaffleFilter raffleFilter;

    public RaffleAdapter(Context context, int resource, ArrayList<Raffle> raffles, SQLiteDatabase db) {
        super(context, resource, raffles); 
        this.mLayoutResourceID = resource;
        this.mDB = db;
        this.mContext = context;
        this.raffles = raffles;
        this.rafflesFiltered = new ArrayList<>(raffles);
    }
    @Override
    public Filter getFilter() {
        if (raffleFilter == null) {
            raffleFilter = new RaffleFilter();
        }
        return raffleFilter;
    }

    class RaffleFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            if (constraint != null && constraint.length() > 0) {
                constraint = constraint.toString().toUpperCase();
                ArrayList<Raffle> filters = new ArrayList<>();

                for (int i = 0; i < rafflesFiltered.size(); i++) {
                    if (rafflesFiltered.get(i).getRaffleName().toUpperCase().contains(constraint)) {
                        Raffle raffle = rafflesFiltered.get(i);
                        filters.add(raffle);
                    }
                }
                results.count = filters.size();
                results.values = filters;
            } else {
                results.count = rafflesFiltered.size();
                results.values = rafflesFiltered;
            }
            return results;
        }
        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            raffles = (ArrayList<Raffle>)filterResults.values;
            notifyDataSetChanged();
        }
    }
}

我的主要活动课程(相关位):

public class MainActivity extends AppCompatActivity {

    RaffleAdapter raffleListAdapter;

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

        final ListView myList = findViewById(R.id.myList);
        final ArrayList<Raffle> raffles = RaffleTable.selectAll(db);

        raffleListAdapter = new RaffleAdapter(MainActivity.this, R.layout.raffle_display, raffles, db);
        myList.setAdapter(raffleListAdapter);
    } 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        MenuItem mSearch = menu.findItem(R.id.search);
        SearchView mSearchView = (SearchView) mSearch.getActionView();
        mSearchView.setQueryHint("Search");
        mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
            @Override
            public boolean onQueryTextChange(String newText) {
                raffleListAdapter.getFilter().filter(newText);
                return true;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }
}

我知道raffles = (ArrayList<Raffle>)filterResults.values;publishResults() 中的行返回了正确的信息,问题是紧随其后的行,调用 notifyDataSetChanged() 似乎没有任何影响。

4

0 回答 0