【发布时间】:2020-09-07 13:18:24
【问题描述】:
我遵循了一些关于 SQLite 和 RecyclerView (https://www.youtube.com/watch?v=VQKq9RHMS_0&ab_channel=Stevdza-San) 的 youtube 教程,我完成了所有事情并根据我的应用程序的需要对其进行了自定义,一切正常。
现在我要做的就是在顶部(操作栏)添加搜索按钮,我可以从我的 RecyclerView 中搜索项目。
所以我试图弄清楚如何实现它,但我在过滤器和所有这些事情上遇到了困难。我看到的每个教程都使用 List (E),而我的 CustomeAdpter 获取 ArrayList,我无法理解如何使其与 ArrayList 一起使用。
所以如果有人可以帮助我并给我一些指导,我将不胜感激
编辑
我在适配器中添加了 getFilter() 函数,但是当我尝试搜索某些内容时,RecyclerView 中没有发生任何事情。
我正在添加我的代码:MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity = MainActivity.this;
noClubsImage = findViewById(R.id.noClubsImage);
noClubsText = findViewById(R.id.noClubsText);
recyclerView = findViewById(R.id.recyclerView);
add_button = findViewById(R.id.add_button);
add_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AddActivity.class);
activity.startActivityForResult(intent,1);
}
});
myDB = new MyDatabaseHelper(MainActivity.this);
club_id = new ArrayList<>();
club_name = new ArrayList<>();
join_date = new ArrayList<>();
expire_date = new ArrayList<>();
storeDataInArrays();
customAdapter = new CustomAdapter(MainActivity.this, this, club_id, club_name, join_date, expire_date);
recyclerView.setAdapter(customAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
}
。 . . 编辑***
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) item.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
customAdapter.getFilter().filter(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
customAdapter.getFilter().filter(newText);
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
}
这是我的适配器:
我在 onBindViewHolder 中添加了 Try & catch 功能,因为如果没有,它就会崩溃并收到此错误:“java.lang.IndexOutOfBoundsException: Index: 1, Size: 1” 添加后,我可以搜索但很奇怪的东西,上传一些图片: When I start the app Start searching "Yasha" -> it change the two rows
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> implements Filterable{
private Context context;
private Activity activity;
private ArrayList club_id, club_name, join_date,expire_date,list,originalList;
int position;
Animation translate_anim;
CustomAdapter(Activity activity, Context context, ArrayList club_id, ArrayList club_name, ArrayList join_date, ArrayList expire_date){
this.activity = activity;
this.context = context;
this.club_id = club_id;
this.club_name = club_name;
this.join_date = join_date;
this.expire_date = expire_date;
this.list = club_name;
this.originalList = club_name;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.my_row,parent,false);
return new MyViewHolder(view);
}
public Filter getFilter(){
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
ArrayList filteredResults = null;
if (constraint.length() == 0) {
filteredResults = club_name;
} else {
filteredResults = getFilteredResults(constraint.toString().toLowerCase());
}
FilterResults results = new FilterResults();
results.values = filteredResults;
Log.d("Test",filteredResults.toString());
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
club_name = (ArrayList<String>) results.values;
notifyDataSetChanged();
}
};
}
protected ArrayList getFilteredResults(String constraint) {
ArrayList results = new ArrayList<>();
for (Object item : originalList) {
if (item.toString().toLowerCase().contains(constraint)) {
results.add(item.toString());
}
}
//Log.d("Test",results.toString());
return results;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
try{
this.position = position;
holder.club_name_txt.setText(String.valueOf(club_name.get(position)));
holder.join_txt.setText(String.valueOf(join_date.get(position)));
holder.expire_txt.setText(String.valueOf(expire_date.get(position)));
holder.mainLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context,UpdateActivity.class);
intent.putExtra("club_id",String.valueOf(club_id.get(position)));
intent.putExtra("club_name",String.valueOf(club_name.get(position)));
intent.putExtra("join_date",String.valueOf(join_date.get(position)));
intent.putExtra("expire_date",String.valueOf(expire_date.get(position)));
activity.startActivityForResult(intent,1);
}
});
}catch(Exception ex) {
Log.e("TAG", "EXCEPTION CAUGHT WHILE EXECUTING DATABASE TRANSACTION");
ex.printStackTrace();
}
}
@Override
public int getItemCount() {
return club_id.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
LinearLayout mainLayout;
TextView club_id_txt, club_name_txt, join_txt,expire_txt;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
club_name_txt = itemView.findViewById(R.id.club_name_txt);
join_txt = itemView.findViewById(R.id.jDate_txt);
expire_txt = itemView.findViewById(R.id.eDate_txt);
mainLayout = itemView.findViewById(R.id.mainLayout);
translate_anim = AnimationUtils.loadAnimation(context, R.anim.translate_anim);
mainLayout.setAnimation(translate_anim);
}
}}
【问题讨论】:
-
@Nik 看,我现在编辑我的问题,我尝试了你放在这里的帖子中的一些方法,但是运行它之后,当我尝试搜索某些东西时没有任何反应。
标签: android android-recyclerview android-sqlite android-search