Действие, которое я пытаюсь вызвать из адаптера представления переработчика, не запускается. Вместо этого оно либо завершает приложение, либо просто возвращается в основное меню.
Я пытаюсь переключиться с одного элемента BookRecyclerViewAdapter на BookActivity. Это часть курса udemy, и я скопировал код из курса один за другим, но на моем виртуальном устройстве новое действие не открывается, а просто возвращается к основному действию. Это код в адаптере:
public class BookRecViewAdapter extends RecyclerView.Adapter<BookRecViewAdapter.ViewHolder> {
private static final String TAG = "BookRecViewAdapter";
private ArrayList<Book> books = new ArrayList<>();
private Context mContext;
public BookRecViewAdapter(Context mContext) {
this.mContext = mContext;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_book, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") int position) {
Log.d(TAG, "onBindViewHolder: Called");
holder.txtName.setText(books.get(position).getName());
Glide.with(mContext)
.asBitmap()
.load(books.get(position).getImageURL())
.into(holder.imgBook);
holder.parent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(mContext, BookActivity.class);
mContext.startActivity(intent);
}
});
Представление переработчика вызывается здесь:
public class AllBooksActivity extends AppCompatActivity {
private RecyclerView booksRecView;
private BookRecViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_all_books);
adapter = new BookRecViewAdapter(this);
booksRecView = findViewById(R.id.booksRecView);
booksRecView.setAdapter(adapter);
booksRecView.setLayoutManager(new LinearLayoutManager(this ));
А это новое занятие:
public class BookActivity extends AppCompatActivity {
private TextView txtBookName, txtAuthor, txtPages, txtDescription;
private Button btnAddToWantToRead, btnAddToAlreadyRead, btnAddToCurrentlyReading, btnAddToFavourite;
private ImageView bookImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
initViews();
а также можете ли вы поделиться кодом, в котором вы вызвали функцию bookRecyclerView?
@MirlavHýbler Да, там заявлено так же, как и другие виды деятельности.
@Laser Shure, я отредактировал вопрос для этого.
вы пытались ввести код в своем AllBooksActivity?. Используя интерфейс адаптера.
@Laser, ты имеешь в виду вставить весь RecViewAdapter в AllBooksAktivity, или в BookActivity, или в оба?
@DecimusSutor нет, я имею в виду создание интерфейса в классе адаптера, а затем вызов его в классе активности.
Итак, создайте такой интерфейс в своем классе адаптера.
public class BookRecViewAdapter extends RecyclerView.Adapter<BookRecViewAdapter.ViewHolder> {
private static final String TAG = "BookRecViewAdapter";
private OnItemClickListener listener; //create a variable listner.
private ArrayList<Book> books = new ArrayList<>();
private Context mContext;
public BookRecViewAdapter(Context mContext) {
this.mContext = mContext;
}
// create a method to initialize the listener.
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
//creating an interface
public interface OnItemClickListener {
void onClick();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_book, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") int position) {
Log.d(TAG, "onBindViewHolder: Called");
holder.txtName.setText(books.get(position).getName());
Glide.with(mContext)
.asBitmap()
.load(books.get(position).getImageURL())
.into(holder.imgBook);
holder.parent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//instead of changing activity here do this.
if (listener != null) {
listener.onClick();
}
}
});
Затем в действии, в котором вы используете адаптер, просто вызывайте интерфейс и переключайтесь между действиями.
adapter.setOnItemClickListener(new BookRecViewAdapter.OnItemClickListener() {
@Override
public void onClick() {
Intent intent = new Intent(YourActivity.this, BookActivity.class);
startActivity(intent);
}
});
Это должно решить вашу проблему.
У вас тоже
BookActivityзаявлено вAndroidManifest.xml?