繁体   English   中英

从 RecyclerView 中搜索

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM