所以,我有一个使用“轻扫以解雇”并实现可过滤的RecyclerView。
什么有效:按预期单独解除和过滤工作。我可以使用适当的动画轻扫以解除(我也会在此操作时从我的SQLite数据库中删除一行)。我也可以使用原生过滤器过滤卡片。
什么不起作用:当我在过滤后滑动以解除时,位置不正确并且正如预期的那样,从我的数据库中删除相应的错误行。
我的想法:我相信我需要在过滤过程之后/期间以某种方式更新我的Activity arrayList。
我在“活动”中的搜索代码
//create options menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_jar_options, menu);
/*return super.onCreateOptionsMenu(menu);*/
action_search = menu.findItem(R.id.menu_jar_action_search);
SearchView searchView = (SearchView) action_search.getActionView();
searchView.setBackgroundColor(0xffffffff);
search(searchView);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
//search
private void search(SearchView searchView) {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText.toLowerCase());
return true;
}
});
}
我的活动中的滑动代码(为清晰起见而清理)
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction){
if (direction ==ItemTouchHelper.RIGHT){
//swipe right - delete card
final int position = viewHolder.getAdapterPosition();
//get necessary data from item
s_deleteIdentifier = arrayList.get(position).getIdentifier();
s_deleteIdentifier = (!FormatHelper.isStringEmpty(s_deleteIdentifier)) ? s_deleteIdentifier : "";
s_deleteName = arrayList.get(position).getName();
s_deleteName = (!FormatHelper.isStringEmpty(s_deleteName)) ? s_deleteName : "";
//REMOVE ME after testing
Toast.makeText(JarActivity.this, "" +position +" " +s_deleteName, Toast.LENGTH_SHORT).show();
adapter.notifyItemRemoved(position);
arrayList.remove(position);
//user confirms delete, so delete row from db
DatabaseHelper.getInstance(JarActivity.this).deleteRow(
"table",
"IDENTIFIER = ?",
new String[] {s_deleteIdentifier}
);
}
我在适配器中的过滤器代码
@Override
public Filter getFilter(){
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence){
String charString;
if (charSequence != null) charString = charSequence.toString();
else charString = "";
if (charString.isEmpty()){
arrayListFiltered = arrayList;
}else{
ArrayList<JarObject> filteredList = new ArrayList<>();
for (JarObject jarObject : arrayList) {
if (jarObject.getName().toLowerCase().contains(charString) ||
jarObject.getLocation().toLowerCase().contains(charString) ||
jarObject.getUserNote().toLowerCase().contains(charString) ||
jarObject.getSummary().toLowerCase().contains(charString)
)
filteredList.add(jarObject);
}
arrayListFiltered = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = arrayListFiltered;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
arrayListFiltered = (ArrayList<JarObject>) filterResults.values;
notifyDataSetChanged();
}
};
}
答案 0 :(得分:1)
原始列表中的项目和已过滤的列表不会处于相同的位置。我现在没有能力将一个示例放在一起,但您应该能够覆盖适配器getItemId()
方法以返回有意义的内容并使用ViewHolder.getItemId()
来获取您想要的实际项目删除而不是取决于位置。
您还可以公开已过滤的列表,以便您可以从活动中访问该列表,以便根据位置从过滤后的列表中获取项目,然后搜索原始列表以获得正确的位置。