简体   繁体   English

意图在 recyclerview onclick 中不起作用

[英]Intent not working in recyclerview onclick

I created a recyclerview that displays a list of users from firebase, i want to send user to another activity whenever they clicks on an item in the list but it kept saying "CurrentActivity is not an enclosing tag" whenever i call on intent.我创建了一个 recyclerview,显示来自 firebase 的用户列表,我想在用户点击列表中的项目时将用户发送到另一个活动,但每当我调用意图时它一直说“CurrentActivity 不是封闭标签” Heres the code这是代码

  public class UserActivity extends AppCompatActivity {
        private Toolbar mToobar;

        private RecyclerView recyclerView;
        private UserAdapter adapter;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_user);

            mToobar = findViewById(R.id.toolbar);
            setSupportActionBar(mToobar);
            Objects.requireNonNull(getSupportActionBar()).setTitle("Find New Friends");
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            mToobar.setTitleTextColor(Color.parseColor("WHITE"));

            recyclerView = findViewById(R.id.recycler);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            //recyclerView.setHasFixedSize(true);



            FirebaseRecyclerOptions<UserModel> options = new FirebaseRecyclerOptions.Builder<UserModel>()
                    .setQuery(FirebaseDatabase.getInstance().getReference().child("Users"), UserModel.class)
                    .build();

            adapter = new UserAdapter(options);
            recyclerView.setAdapter(adapter);
            recyclerView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent i = new Intent(UserActivity.this, ProfileActivity.class);
                    startActivity(i);
                }
            });
        }



        @Override
        protected void onStart() {
            super.onStart();
            adapter.startListening();
        }

        @Override
        protected void onStop() {
            super.onStop();
            adapter.stopListening();
        }


    }

Here's the adapter class这是适配器类

public class UserAdapter extends FirebaseRecyclerAdapter<UserModel, UserAdapter.UserViewHolder> {



    /**
     * Initialize a {@link RecyclerView.Adapter} that listens to a Firebase query. See
     * {@link FirebaseRecyclerOptions} for configuration options.
     *
     * @param options
     */
    public UserAdapter(@NonNull FirebaseRecyclerOptions<UserModel> options) {
        super(options);
    }


    @Override
    protected void onBindViewHolder(@NonNull UserViewHolder holder, int position, @NonNull UserModel model) {

        holder.mName.setText(model.getName());
        holder.mStatus.setText(model.getStatus());
        Picasso.get().load(model.getImage()).placeholder(R.drawable.avatar).into(holder.mImage);

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(UserActivity.this, ProfileActivity.class);
                startActivity(intent);
                //heres the error, UserActivity is not an enclosing tag
            }
        });


    }

    @NonNull
    @Override
    public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.single_user_layout, parent, false);
        return new UserViewHolder(view);
    }

    class UserViewHolder extends RecyclerView.ViewHolder{

        TextView mName, mStatus;
        CircleImageView mImage;

        public UserViewHolder(@NonNull View itemView) {
            super(itemView);

            mName = itemView.findViewById(R.id.user_displayname);
            mStatus = itemView.findViewById(R.id.user_status);
            mImage = itemView.findViewById(R.id.user_photo);
        }
    }
}

This is the model class这是模型类

public class UserModel {
    public String name;
           String image;
           String status;

    public UserModel() {
    }

    @Override
    public String toString() {
        return "UserModel{" +
                "name='" + name + '\'' +
                ", image='" + image + '\'' +
                ", status='" + status + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}

Can someone help me on better way on how to implement onClickListener , please?有人可以帮助我更好地实现onClickListener吗?

use holder.itemView.getContext() instead of UserActivity.this in your adapter classs.在您的适配器类中使用holder.itemView.getContext()而不是UserActivity.this

holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Context context = holder.itemView.getContext();
            Intent intent = new Intent(context, ProfileActivity.class);
            context.startActivity(intent);
        }
    })

And removed this block of code because you need to set click listeners on individual views within the RecyclerView, rather than the RecyclerView as a whole.并删除了这段代码,因为您需要在 RecyclerView 中的各个视图上设置单击侦听器,而不是整个 RecyclerView。

recyclerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(UserActivity.this, ProfileActivity.class);
                startActivity(i);
            }
        });

You can also send the View.onClickListener to the constructor of the list something like:您还可以将 View.onClickListener 发送到列表的构造函数,例如:

View.onClickListener listener; View.onClickListener 监听器;

public UserAdapter(@NonNull FirebaseRecyclerOptions<UserModel> options, View.onClickListener listener) {
        super(options);
        this.listener = listener;
    }

... ...

holder.itemView.setOnClickListener(listener); //this part will be in your onBindViewHolder

in your activity you need to implement the interface View.onClickListener and in在您的活动中,您需要实现接口 View.onClickListener 并在

@Override
public void onClick(View v){
     Intent i = new Intent(UserActivity.this, ProfileActivity.class);
                startActivity(i);
}

and when you create your adapter use the following code:创建适配器时,请使用以下代码:

FirebaseRecyclerOptions<UserModel> options = new FirebaseRecyclerOptions.Builder<UserModel>()
                    .setQuery(FirebaseDatabase.getInstance().getReference().child("Users"), UserModel.class)
                    .build();

            adapter = new UserAdapter(options,this);

You are passing UserActivity as a current activity.您将 UserActivity 作为当前活动传递。 Pls pass context to your adapter constructor.请将上下文传递给您的适配器构造函数。

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.MyViewHolder>() {
    private ArrayList<UserResult> userList;
    private Activity mActivity;

    public AdapterChatList(Activity mActivity, ArrayList<UserResult> mUserList) {
        this.mActivity = mActivity;
        this.userList = mUserList;
    }
}

Set context to your startactivity.为您的 startactivity 设置上下文。

holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(mActivity,ProfileActivity.class);
            startActivity(intent);
            //Pass context object as your current activity
        }
    });

Pass context in your activity where you define the adapter.在您定义适配器的活动中传递上下文。

 mUserAdapter = new UserAdapter (getActivity(), userArrayList);
 recyclerView.setAdapter(mUserAdapter );

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

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