过滤后回收器视图中有错误的项目



嗨,我有一个回收器视图适配器,如下所示:-

public class RecyclerViewAdapter extends RecyclerView.Adapter<ViewHolder> {
List<Data> list = Collections.emptyList();
Context context;
public RecyclerViewAdapter(List<Data> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//Inflate the layout, initialize the View Holder
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.apps_layout, parent, false);
ViewHolder holder = new ViewHolder(v);
return holder;
}
@Override
public void onViewDetachedFromWindow(ViewHolder holder) {
super.onViewDetachedFromWindow(holder);
((ViewHolder)holder).itemView.clearAnimation();
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//Use the provided View Holder on the onCreateViewHolder method to populate the current row on the RecyclerView
holder.title.setText(list.get(position).title);
holder.description.setText(list.get(position).description);
}
public void setFilter(List<Data> searched_data) {
list = new ArrayList<>();
list.addAll(searched_data);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
//returns the number of elements the RecyclerView will display
return list.size();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
// Insert a new item to the RecyclerView on a predefined position
public void insert(int position, Data data) {
list.add(position, data);
notifyItemInserted(position);
}
// Remove a RecyclerView item containing a specified Data object
public void remove(Data data) {
int position = list.indexOf(data);
list.remove(position);
notifyItemRemoved(position);
}
}

好的,现在您可以看到设置过滤器方法来过滤回收器查看列表

这是我怎么称呼它的

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
List<Data> filteredModelList = filter(data, s);
adapter.setFilter(filteredModelList);
return true;
}
});

现在过滤器工作正常,现在当我单击它时位置错误

我知道错误来自该位置,因为较旧的回收器单击时查看具有旧的位置索引,无论如何我不知道如何解决它,这里是 onclicklistener

data = appsdata(); // load the list List<Data>
Collections.sort(data); // sorting
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
adapter = new RecyclerViewAdapter(data, this);
recyclerView.setAdapter(adapter);
recyclerView.setNestedScrollingEnabled(false);
recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, recyclerView, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
String s = data.get(position).title;
String ss = data.get(position).description;
Intent intent = new Intent(MainAcitivity.this, Work.class);
intent.putExtra("title", s);
intent.putExtra("desc", ss);
startActivity(intent);
}
}));

我知道这条线导致问题

String s = data.get(position).title;

因为它与未过滤列表时的旧列表相同,所以我如何更新此回收器视图,以便在启动工作时获得更新的索引.class

好吧,伙计们,这对我部分有用

我尝试通过添加来更新数据列表

data = filteredModelList;  // add this line

过滤后,这工作正常

@Override
public boolean onQueryTextChange(String s) {
List<Data> filteredModelList = filter(data, s);
adapter.setFilter(filteredModelList);
data = filteredModelList;  // add this line
return true;
}

现在我得到了真正的索引,但是当我搜索并清除列表时,列表是空的,因为我替换了数据列表:(

编辑:- 我通过黑客修复了它,不是一个好方法,但有效

如您所见,在编辑之前使用上述内容,旧列表已消失

当我曾经更改数据列表时

data = filteredModelList;  // add this line

然后新数据列表只有过滤的值,当您清除 searchView 时,该数据列表为空,因为它没有那些所有应用程序列表 我所做的是我制作了新列表作为data_fix和 onclicklistener 我使用了 datafix 而不是数据列表

看看这个如何

RecyclerItemClickListener 方法

String s = datafix.get(position).title;  // data.get to datafix.get
String ss = datafix.get(position).description; // data.get to datafix.get

现在开始过滤器调用 我叫这个

datafix = filteredModelList; // instead of data = filteredModelList;

我也在创建时初始化它,因此它在启动应用程序时不会为空

data = appsdata(); // load the list List<Data>
datafix = appsdata(); // load the list List<Data>  added just below it to intialize

现在这样,完全加载的应用程序列表//列表数据保持完整并且即使您从搜索中清除也不会清除视图和索引就可以

逻辑在于您如何更新回收器视图项目,

public void setFilter(List<Data> searched_data) {
list = new ArrayList<>();
list.addAll(searched_data);
notifyDataSetChanged();
}

上面的行不是必需的,adapter = new RecyclerViewAdapter(data, this);理解这一行非常重要。您会看到,当您将数据传递到适配器时,您正在适配器中的列表和外部之间创建一个符号链接。因此,对外部列表所做的任何更改都会更新适配器版本。只需致电adapter.notifyDatasetChange method每当对数据模型对象进行任何更改时,请执行此操作。

将以下内容从

List<Data> filteredModelList = filter(data, s);
adapter.setFilter(filteredModelList);
data = filteredModelList;  // add this line
return true;

adapter.list.clear();
data = filter(data, s);
adapter.notifyDataSetChange();

最新更新