簡體   English   中英

過濾器RecyclerView Android無法正常工作

[英]Filter RecyclerView Android Not working

我已經實現了recycler view並在Internet上進行了搜索,如何實現數據filter ,當我運行該應用程序並開始搜索時遇到了問題! 沒有任何顯示,沒有錯誤,該方法不起作用,我將發布我的代碼,如果有人有想法請告訴我

RceyclerView適配器

public class TodoRecyclerAdapter extends RecyclerView.Adapter<TodoRecyclerAdapter.ViewHolder> {

static List<ToDo> todoResults;
static Context context;
static List<Data> resultslocal;

private ArrayList<ToDo> arrayList = null, stringArrayList;
static List<Data> localData;

ArrayList<Data> arraylist;
private List<String> mDefaultCheeses;
private List<String> mFilteredCheeses;



public TodoRecyclerAdapter(TodoList todoList, List<Data> dbList) {
    this.localData = dbList;
    arraylist = new ArrayList<Data>();
    arraylist.addAll(localData);

}


@Override
public TodoRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.todo_items, null);
    ViewHolder viewHolder = new ViewHolder(itemLayoutView);
    return viewHolder;
}

@Override
public void onBindViewHolder(final TodoRecyclerAdapter.ViewHolder holder, final int position) {
    holder.todoTitle.setText(localData.get(position).getTODO_TITLE().toString());
    String priority = localData.get(position).getPriority().toString();
    if (priority.equals("Low")) {
        holder.todoImage.setImageResource(R.drawable.low);
    } else if (priority.equals("Normal")) {
        holder.todoImage.setImageResource(R.drawable.normal);
    } else if (priority.equals("High")) {
        holder.todoImage.setImageResource(R.drawable.high);
    }
}

@Override
public int getItemCount() {
    return localData.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder {
    public TextView todoTitle;
    public ImageView todoImage;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        todoTitle = (TextView) itemLayoutView.findViewById(R.id.todo_title);
        todoImage = (ImageView) itemLayoutView.findViewById(R.id.imageView2);
    }
}

public void filter(String charText) {

    charText = charText.toLowerCase(Locale.getDefault());

    localData.clear();
    if (charText.length() == 0) {
        localData.addAll(arraylist);

    } else {
        for (Data data : arraylist) {
            if (charText.length() != 0 && data.getTODO_TITLE().toLowerCase(Locale.getDefault()).contains(charText)) {
                localData.add(data);
            } else if (charText.length() != 0 && data.getPriority().toLowerCase(Locale.getDefault()).contains(charText)) {
                localData.add(data);
            }
        }
    }
    notifyDataSetChanged();
}

}

並且在Activity中調用filter方法時

  @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_search, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
        }
    });
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return true;
        }

        @Override
        public boolean onQueryTextChange(final String searchQuery) {
            recyclerAdapter.filter(searchQuery.toString().trim());
            todoRecyclerView.invalidate();
            return true;

        }
    });
    MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            return true;
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            return true;
        }
    });
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_search) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}}

編輯使用MatchableRVArrayAdapter

在我添加MatchableRVArrayAdapter.class之后,請執行以下操作

public class TodoAdapter extends MatchableRVArrayAdapter<ToDo, TodoAdapter.VH> {
public TodoAdapter(Context context) {
    super(context, android.R.layout.simple_list_item_1);
}

@Override
protected VH onCreateHolder(View view) {
    return new VH(view);
}

@Override
protected void onBindHolder(ToDo item, VH holder, int position) {
    holder.note.setText(item.getTODO_TITLE());
}

@Override
protected boolean matches(ToDo value, String lowerCasePrefix) {
    return value.getTODO_TITLE().toLowerCase().contains(lowerCasePrefix);
}

class VH extends RecyclerView.ViewHolder {
    private final TextView note;
    public VH(View itemView) {
        super(itemView);
        note = (TextView) itemView.findViewById(android.R.id.text1);
    }
}

}和主要活動

 MatchableRVArrayAdapter matchableRVArrayAdapter;
TodoAdapter todoAdapter1;
public List<Data> dbList;
Data data = new Data();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_todo_list);
    getLocalData();
    todoRecyclerView = (RecyclerView) findViewById(R.id.todoRecyclerView);
    todoRecyclerView.setHasFixedSize(true);
    results = new ArrayList<ToDo>();
    DatabaseHelpher helpher = new DatabaseHelpher(this);
    dbList = new ArrayList<Data>();
    todoAdapter1= new TodoAdapter(this);
    dbList.addAll(helpher.getDataFromDB());
    matchableRVArrayAdapter.add(dbList);

並進入菜單

 searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return true;
        }
        @Override
        public boolean onQueryTextChange(final String searchQuery) {

            todoAdapter1.getFilter().filter(searchQuery);
            return false;}});

我知道這個錯誤

    Caused by: java.lang.NullPointerException
                                                     at com.example.todo.loginretroft.Activites.TodoList.onCreate(TodoList.java:67)

TodoList.java:67=matchableRVArrayAdapter.add(dbList);

實施到SearchView.OnQueryTextListener

初始化SearchView ...

    SearchView.setOnQueryTextListener(this);
    SearchView.setQueryHint("Search ...");
    SearchView.setIconifiedByDefault(true);

創建一個自定義過濾器列表

private List<Movie> filter(List<Movie> datas, String newText) {
    newText = newText.toLowerCase();

    final List<Movie> filteredModelList = new ArrayList<>();
    for (Movie data : datas) {
        final String text = data.getTitle().toLowerCase();
        if (text.contains(newText)) {
            filteredModelList.add(data);
        }
    }
    return filteredModelList;
}

將此添加到您的適配器類

    public void setItems(List<Movie> datas) {
    moviesList = new ArrayList<>(datas);
}

將這些代碼寫在實現的子代碼中

@Override
public boolean onQueryTextChange(String newText) {
    final List<Movie> filteredModelList = filter(movieList, newText);
    mAdapter.setItems(filteredModelList);
    mAdapter.notifyDataSetChanged();
    recyclerView.scrollToPosition(0);
    return false;
}

@Override
public boolean onQueryTextSubmit(String arg0) {
    return false;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM