#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. спасибо за помощь, но я, кажется, не могу заставить ее работать.