[英]Searching from a RecyclerView
我目前在我的 Android Studio 应用程序中有一个正常工作的 RecyclerView。 用户需要输入一个名称和 4 个不同的值。 此 RecyclerView 通过 SQL 运行,输入数据时没有问题。 当显示 RecyclerView 并且所有数据都完美定位并且一切正常时,数据会更新。
我在 RecyclerView 顶部实现了 Search function,这意味着用户可以搜索特定名称。 然而,似乎在使用搜索 function 时,他们显示在名称旁边的数据会更新以获取 ArrayList 中数据的当前 position。 正常查看列表时不是这种情况,这是我在实现搜索 function 时做错了吗? 有关搜索的代码,请参见下文:
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> implements Filterable {
UserLoginAdapter userLoginAdapter;
private Context context;
private ArrayList<String> FoodID, FoodName, Calories;
private ArrayList<String> FoodNameDuplicate;
private OnItemClickListener mOnItemClickListener;
public interface OnItemClickListener{
public void onItemClick(View view, int position);
}
CustomAdapter(Context context, ArrayList FoodID, ArrayList FoodName, ArrayList Calories, OnItemClickListener onItemClickListener) {
this.context = context;
this.FoodID = FoodID;
this.FoodName = FoodName;
this.Calories = Calories;
FoodNameDuplicate = new ArrayList<>(FoodName);
mOnItemClickListener = onItemClickListener;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.foodrows, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
holder.FoodID.setText(String.valueOf(FoodID.get(position)));
holder.FoodName.setText(String.valueOf(FoodName.get(position)));
holder.Calories.setText(Calories.get(position)); //(String.valueOf(Calories.get(position)));
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//mOnItemClickListener.onItemClick(v, holder.getAdapterPosition());
//Toast.makeText(context, Calories.get(position), Toast.LENGTH_SHORT).show();
SharedPreferences sharedPreferences = context.getSharedPreferences("calories", 0);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("caloriesInput", Calories.get(position));
editor.commit();
Intent intent = new Intent(v.getContext(), HomePage.class);
context.startActivity(intent);
//AppCompatActivity appCompatActivity = (AppCompatActivity)v.getContext();
//FoodDiaryFragment foodDiaryFragment = new FoodDiaryFragment();
//appCompatActivity.getSupportFragmentManager().beginTransaction().replace(R.id.inputRecyclerView, foodDiaryFragment).addToBackStack(null).commit();
}
});
}
@Override
public int getItemCount() {
return FoodName.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView FoodID, FoodName, Calories;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
FoodID = itemView.findViewById(R.id.textView_FoodID);
FoodName = itemView.findViewById(R.id.textView_FoodNameTextView);
Calories = itemView.findViewById(R.id.textView_FoodCaloriesTextView);
}
}
@Override
public Filter getFilter() {
return foodFilter;
}
private Filter foodFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
ArrayList<String> filteredList = new ArrayList<>();
if(constraint == null || constraint.length() == 0){
filteredList.addAll(FoodNameDuplicate);
} else {
java.lang.String filterPattern = constraint.toString().toLowerCase().trim();
for(String item : FoodNameDuplicate){
if(item.toLowerCase().contains(filterPattern)){
filteredList.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
FoodName.clear();
FoodName.addAll((ArrayList)results.values);
notifyDataSetChanged();
}
};
}
回收站查看 java 文件:
public class InputFoodToDiary extends AppCompatActivity {
RecyclerView recyclerView;
UserDatabase userDatabase;
ArrayList<String> FoodID, FoodName, Calories;
CustomAdapter customAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_inputfoodtodiary);
recyclerView = findViewById(R.id.recyclerView_InputFood);
userDatabase = new UserDatabase(InputFoodToDiary.this, "CALTOR", null, 1);
FoodID = new ArrayList<>();
FoodName = new ArrayList<>();
Calories = new ArrayList<>();
storeDataInArrays();
customAdapter = new CustomAdapter(InputFoodToDiary.this, FoodID, FoodName, Calories, new CustomAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
//Toast.makeText(getApplicationContext(), Calories.get(position), Toast.LENGTH_SHORT).show();
//onBackPressed();
}
});
recyclerView.setAdapter(customAdapter);
recyclerView.setLayoutManager(new LinearLayoutManager(InputFoodToDiary.this));
}
void storeDataInArrays(){
Cursor cursor = userDatabase.readAllData();
if(cursor.getCount() == 0){
Toast.makeText(this, "No Data.", Toast.LENGTH_SHORT).show();
} else {
while (cursor.moveToNext()){
FoodID.add(cursor.getString(0));
FoodName.add(cursor.getString(1));
Calories.add(cursor.getString(2));
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.food_search, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView)searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
customAdapter.getFilter().filter(newText);
return false;
}
});
return true;
}
@Override
public void onBackPressed(){
super.onBackPressed();
}
}
由于您已经将 item 作为 String ,因此您不需要向其添加 toString() 方法。
尝试这个:
for(String item : FoodNameDuplicate){
if(item.toLowerCase().contains(filterpattern)){
filteredList.add(item);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.