简体   繁体   English

RecylerView onClickListener 适用于所有片段

[英]RecylerView onClickListener works on all fragment

I have implemented a recyclerview in my activity and I added a onclick listener to recently.我在我的活动中实现了一个 recyclerview,最近我添加了一个 onclick 监听器。 It was working fine, until I switch over to another fragment and realized the click was also working there so if I pressed randomly somewhere on the screen it would bring me the item click in the recycler view.它工作正常,直到我切换到另一个片段并意识到点击也在那里工作,所以如果我随机按下屏幕上的某个地方,它会在回收站视图中给我带来项目点击。 Please let me know how can I only make the recyclerview be clickable on one activity, the home page and no the other.请让我知道如何才能使回收视图只能在一个活动、主页上单击,而在另一个活动上不可单击。

HomePage.class主页.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));

        FirebaseRecyclerOptions<Model> options =
                new FirebaseRecyclerOptions.Builder<Model>()
                        .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电影适配器.class

public class MovieAdapter extends FirebaseRecyclerAdapter<Model,MovieAdapter.myViewHolder> {




    /**
     * Initialize a {@link RecyclerView.Adapter} that listens to a Firebase query. See
     * {@link FirebaseRecyclerOptions} for configuration options.
     *
     * @param options
     */
    public MovieAdapter(@NonNull FirebaseRecyclerOptions<Model> 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);
        }
    }
}

It works in every time you used this adapter because the onclicklistener is always working, to change this you can create your own custom listener interface, so you can control to add it or not每次使用此适配器时它都有效,因为 onclicklistener 始终有效,要更改它,您可以创建自己的自定义侦听器接口,因此您可以控制是否添加它

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

You need to create the instance in the adapter and setter for it您需要在适配器中创建实例并为其设置

private OnModelClickListener onModelClickListener

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

and inside onBindViewHolder you will run this listener if it is not null如果不是 null,则在 onBindViewHolder 内部运行此侦听器

if (onModelClickListener != null) {
    myViewHolder.itemView.setOnClickListener(new View.OnClickListener(){
        onModelClickListener.onClick(model)
    }
}

In fragment that you want the listener to work on it, you will use the setter在您希望侦听器对其进行处理的片段中,您将使用 setter

adapter.setOnModelClickListener(model -> {
    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);
});
``

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM