RecylerView OnClickListener работает со всеми фрагментами

#android #android-fragments #android-recyclerview

Вопрос:

Я реализовал в своей деятельности просмотр вторсырья и недавно добавил прослушиватель onclick. Это работало нормально, пока я не переключился на другой фрагмент и не понял, что щелчок также работает там, поэтому, если я случайно нажму где-нибудь на экране, это приведет к щелчку элемента в представлении переработчика. Пожалуйста, дайте мне знать, как я могу сделать так, чтобы просмотр вторсырья был доступен только для одного вида деятельности, домашней страницы, а не для другого.

HomePage.class

 package com.example.movieapp;  import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout;  import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.ViewGroup;  import androidx.appcompat.widget.Toolbar; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView;  import com.firebase.ui.database.FirebaseRecyclerAdapter; import com.firebase.ui.database.FirebaseRecyclerOptions; import com.google.android.material.navigation.NavigationBarView; import com.google.android.material.navigation.NavigationView; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.Query;  public class HomePage extends AppCompatActivity implements NavigationBarView.OnItemSelectedListener {  private DrawerLayout drawer;   RecyclerView recylerView;  MovieAdapter mainAdapter;   @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_home_page);  Toolbar toolbar = findViewById(R.id.toolbar);  setSupportActionBar(toolbar);   recylerView = (RecyclerView) findViewById(R.id.rv);  recylerView.setLayoutManager(new LinearLayoutManager(this));   FirebaseRecyclerOptionslt;Modelgt; options =  new FirebaseRecyclerOptions.Builderlt;Modelgt;()  .setQuery(FirebaseDatabase.getInstance().getReference().child("movie"), Model.class)  .build();   mainAdapter = new MovieAdapter(options);  recylerView.setAdapter(mainAdapter);   drawer = findViewById(R.id.drawer_layout);  NavigationView navigationView = findViewById(R.id.nav_view);  navigationView.setNavigationItemSelectedListener(this::onNavigationItemSelected);    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);  drawer.addDrawerListener(toggle);  getSupportActionBar().setTitle(null);  toggle.setDrawerIndicatorEnabled(true);    toggle.syncState();  }   public boolean onCreateOptionsMenu(Menu menu) {  getMenuInflater().inflate(R.menu.toolbar_menu, menu);  return super.onCreateOptionsMenu(menu);  }     @Override  public boolean onNavigationItemSelected(@NonNull MenuItem item) {  switch(item.getItemId()) {  case R.id.nav_home:  getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,  new HomeFragment()).commit();  break;  case R.id.nav_profile:  // Intent intent = new Intent (getApplicationContext(), UserProfile.class);  // startActivity(intent);  getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,  new ProfileFragment()).commit();  break;  case R.id.nav_cart:   getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,  new CartFragment()).commit();  break;  }  drawer.closeDrawer(GravityCompat.START);  return true;  }   @Override  public void onBackPressed() {  if (drawer.isDrawerOpen(GravityCompat.START)) {  drawer.closeDrawer(GravityCompat.START);  } else {  super.onBackPressed();  }  }      @Override  public void onStart() {  super.onStart();  mainAdapter.startListening();  }   @Override  public void onStop() {  super.onStop();  mainAdapter.stopListening();  } }    

MovieAdapter.class

 public class MovieAdapter extends FirebaseRecyclerAdapterlt;Model,MovieAdapter.myViewHoldergt; {      /**  * Initialize a {@link RecyclerView.Adapter} that listens to a Firebase query. See  * {@link FirebaseRecyclerOptions} for configuration options.  *  * @param options  */  public MovieAdapter(@NonNull FirebaseRecyclerOptionslt;Modelgt; options) {  super(options);  }   @Override  protected void onBindViewHolder(@NonNull myViewHolder myViewHolder, int i, @NonNull Model model) {  myViewHolder.name.setText(model.getName());  myViewHolder.shortDesc.setText(model.getShortDesc());  myViewHolder.release.setText(model.getRelease());   Glide.with(myViewHolder.img.getContext()).load(model.getImage()).placeholder(R.drawable.common_google_signin_btn_icon_dark)  .error(R.drawable.common_google_signin_btn_icon_dark_normal)  .into(myViewHolder.img);    myViewHolder.itemView.setOnClickListener(new View.OnClickListener(){  @Override  public void onClick(View view) {  Intent intent = new Intent (view.getContext(), MovieDetails.class);  Bundle bundle = new Bundle();   String test = model.getName()   " Selected";   Toast toast = Toast.makeText(view.getContext(), test ,Toast.LENGTH_SHORT);  toast.show();   view.getContext().startActivity(intent);  }  });  }   @NonNull  @Override  public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {  View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_item, parent, false);  return new myViewHolder(view);  }   class myViewHolder extends RecyclerView.ViewHolder {   ImageView img;  TextView name,shortDesc,release;   public myViewHolder(@NonNull View itemView) {  super(itemView);   img = (ImageView) itemView.findViewById(R.id.img1);  name = (TextView) itemView.findViewById(R.id.nametext);  shortDesc = (TextView) itemView.findViewById(R.id.shortDesctext);  release = (TextView) itemView.findViewById(R.id.releasetext);  }  } }  

Ответ №1:

Это работает каждый раз, когда вы использовали этот адаптер, потому что onclicklistener всегда работает, чтобы изменить это, вы можете создать свой собственный пользовательский интерфейс прослушивателя, чтобы вы могли контролировать, добавлять его или нет

 public interface OnModelClickListener {  void onClick(Model model); }  

Вам нужно создать экземпляр в адаптере и настроить для него

 private OnModelClickListener onModelClickListener  public void setOnModelClickListener(OnModelClickListener listener) (  this.onModelClickListener = listener; }  

и внутри onBindViewHolder вы запустите этот прослушиватель, если он не равен нулю

 @Override protected void onBindViewHolder(@NonNull myViewHolder myViewHolder, int i, @NonNull Model model) {  myViewHolder.name.setText(model.getName());  myViewHolder.shortDesc.setText(model.getShortDesc());  myViewHolder.release.setText(model.getRelease());   Glide.with(myViewHolder.img.getContext()).load(model.getImage()).placeholder(R.drawable.common_google_signin_btn_icon_dark)  .error(R.drawable.common_google_signin_btn_icon_dark_normal)  .into(myViewHolder.img);   if (onModelClickListener != null) {  myViewHolder.itemView.setOnClickListener(v -gt; {  onModelClickListener.onClick(model)  });  } }  

В фрагменте, над которым вы хотите, чтобы слушатель работал над ним, вы будете использовать сеттер

 adapter.setOnModelClickListener(model -gt; {  Intent intent = new Intent (view.getContext(), MovieDetails.class);  Bundle bundle = new Bundle();   String test = model.getName()   " Selected";   Toast toast = Toast.makeText(view.getContext(), test ,Toast.LENGTH_SHORT);  toast.show();   startActivity(intent); }); ``  

Комментарии:

1. Хорошо понял, только один вопрос, где именно я бы добавил метод onmodelclicklistener, например, какой класс.

2. onmodelclicklistener и сеттер будут находиться в самом адаптере, поэтому мы можем вызывать onClick при просмотре. OnClickListener работает

3. эй, что касается последнего кода, того, в котором вы хотите, чтобы слушатель работал во фрагменте, в какую функцию я должен добавить код? относится ли это к методу onCreate

4. Добавьте его при инициализации адаптера, просто инициализируйте его, а затем вызовите setOnModelClickListener

5. спасибо за помощь, но я, кажется, не могу заставить ее работать.