Android:无法正确显示 RecyclerView
Posted
技术标签:
【中文标题】Android:无法正确显示 RecyclerView【英文标题】:Android: Fails to display RecyclerView correctly 【发布时间】:2021-01-10 00:11:52 【问题描述】:我正在尝试查看 sql 搜索的结果,然后在 recyclerview 中显示结果,但是当我按下按钮时没有任何反应。调试显示按钮按下已被确认,但没有执行任何操作。
主类
public class RecipeSearch extends MainActivity
EditText searchText;
Spinner typeSpinner;
List<com.stu54259.plan2cook.Model.Category> searchList = new ArrayList<>();
SQLiteDatabase db;
Cursor c;
String searchType;
RecyclerView listSearch;
RecipeSearchAdapter adapterRecipe;
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recipe_search);
Button Search = (Button)findViewById(R.id.btnSearch);
Search.setOnClickListener(view -> RecipeSearch());
adapterRecipe = new RecipeSearchAdapter(this, searchList);
listSearch = findViewById(R.id.listSearch);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this,
LinearLayoutManager.VERTICAL, false);
listSearch.setLayoutManager(mLayoutManager);
listSearch.setItemAnimator(new DefaultItemAnimator());
listSearch.setAdapter(adapterRecipe);
public void RecipeSearch()
searchList.clear();
searchText = findViewById(R.id.editSearch);
typeSpinner = (Spinner) findViewById(R.id.typeSpinner);
searchType = typeSpinner.getSelectedItem().toString();
db = (new DatabaseManager(this).getWritableDatabase());
String RECIPE_SEARCH = " SELECT A.recipe_name, A.image, A.image2, A.category, A.preparation_time, A.cost, B.ingredient " +
"FROM " + DatabaseManager.TABLE_RECIPE + " AS A JOIN " + DatabaseManager.TABLE_QUANTITY + " AS B ON A.recipe_name = B.recipe";
String selectQuery = "";
selectQuery = RECIPE_SEARCH + " WHERE " + searchType + " LIKE ?";
c = db.rawQuery(selectQuery, new String[]"%" + searchText + "%");
if (c.moveToFirst())
do
com.stu54259.plan2cook.Model.Category category = new com.stu54259.plan2cook.Model.Category();
category.setRecipe_name(c.getString(c.getColumnIndex("recipe_name")));
category.setImage(c.getInt(c.getColumnIndex("image")));
category.setImage2(c.getString(c.getColumnIndex("image2")));
category.setCategory_name(c.getString(c.getColumnIndex("category")));
searchList.add(category);
while (c.moveToNext());
c.close();
回收站适配器
公共类 RecipeSearchAdapter 扩展 RecyclerView.Adapter
private List<Category> searchList;
private LayoutInflater mInflater;
private com.stu54259.plan2cook.RecipeCategoryAdapter.ItemClickListener mClickListener;
// data is passed into the constructor
RecipeSearchAdapter(Context context, List<Category> data)
this.mInflater = LayoutInflater.from(context);
this.searchList = data;
// inflates the row layout from xml when needed
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View view = mInflater.inflate(R.layout.cardview_recipe, parent, false);
return new ViewHolder(view);
/**
* Called by RecyclerView to display the data at the specified position. This method should
* update the contents of the @link ViewHolder#itemView to reflect the item at the given
* position.
* <p>
* Note that unlike @link ListView, RecyclerView will not call this method
* again if the position of the item changes in the data set unless the item itself is
* invalidated or the new position cannot be determined. For this reason, you should only
* use the <code>position</code> parameter while acquiring the related data item inside
* this method and should not keep a copy of it. If you need the position of an item later
* on (e.g. in a click listener), use @link ViewHolder#getAdapterPosition() which will
* have the updated adapter position.
* <p>
* Override @link #onBindViewHolder(ViewHolder, int, List) instead if Adapter can
* handle efficient partial bind.
*
* @param holder The ViewHolder which should be updated to represent the contents of the
* item at the given position in the data set.
* @param position The position of the item within the adapter's data set.
*/
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position)
holder.myTextView1.setText(searchList.get(position).getRecipe_name());
holder.myTextView2.setText(searchList.get(position).getCategory_name());
String image2 = searchList.get(position).getImage2();
Bitmap myBitmap = BitmapFactory.decodeFile(image2);
if (myBitmap != null)
holder.imgImage.setImageBitmap(myBitmap);
else
holder.imgImage.setImageResource(searchList.get(position).getImage());
// total number of rows
@Override
public int getItemCount()
return searchList.size();
// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
TextView myTextView1;
TextView myTextView2;
ImageView imgImage;
ViewHolder(View itemView)
super(itemView);
myTextView1 = itemView.findViewById(R.id.txtName);
myTextView2 = itemView.findViewById(R.id.txtCategory);
imgImage = itemView.findViewById(R.id.imgImage);
itemView.setOnClickListener(this);
itemView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Intent intent = new Intent(view.getContext(),Recipe.class);
intent.putExtra("NAME", myTextView1.getText().toString()); //you used recipe name with this id (myTextView1) so.
view.getContext().startActivity(intent);
);
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
@Override
public void onClick(View v)
// allows clicks events to be caught
void setClickListener(RecipeCategoryAdapter.ItemClickListener itemClickListener)
this.mClickListener = itemClickListener;
// parent activity will implement this method to respond to click events
public interface ItemClickListener
void onItemClick(View view, int position);
【问题讨论】:
【参考方案1】:更改按钮的监听器:
Search.setOnClickListener(view -> RecipeSearch());
到:
Search.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
RecipeSearch();
adapterRecipe.notifyDataSetChanged();
);
以便RecyclerView
的适配器收到通知列表已更改并且必须刷新。
也改变这一行:
c = db.rawQuery(selectQuery, new String[]"%" + searchText + "%");
到:
c = db.rawQuery(selectQuery, new String[]"%" + searchText.getText().toString() + "%");
因为searchText
是EditText
,您必须将其文本传递给查询。
【讨论】:
评论不用于扩展讨论;这个对话是moved to chat。以上是关于Android:无法正确显示 RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章
Android Camera Preview 无法在 Google Glass 上正确显示?