【问题标题】:Android: Fails to display RecyclerView correctlyAndroid:无法正确显示 RecyclerView
【发布时间】: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);

}

}

【问题讨论】:

    标签: java android sqlite android-recyclerview android-sqlite


    【解决方案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() + "%"});
    

    因为searchTextEditText,您必须将其文本传递给查询。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 2020-01-25
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多