【发布时间】:2021-05-16 05:34:46
【问题描述】:
我目前在我的 Android Studio 应用程序中有一个正常工作的 RecyclerView。用户需要输入一个名称和 4 个不同的值。这个 RecyclerView 通过 SQL 运行,输入数据时没有问题。当 RecyclerView 显示并且所有数据都完美定位并且一切正常时,数据会更新。
我在 RecyclerView 顶部实现了搜索功能,这意味着用户可以搜索特定名称。但是,似乎在使用搜索功能时,名称旁边显示的数据会更新以获取数据在 ArrayList 中的当前位置。正常查看列表时不是这种情况,这是我在实现搜索功能时做错了吗?有关搜索的代码,请参见下文:
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();
}
};
}
RecyclerView 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();
}
}
【问题讨论】:
标签: java sqlite android-studio arraylist android-recyclerview