簡體   English   中英

意圖在 recyclerview onclick 中不起作用

[英]Intent not working in recyclerview onclick

我創建了一個 recyclerview,顯示來自 firebase 的用戶列表,我想在用戶點擊列表中的項目時將用戶發送到另一個活動,但每當我調用意圖時它一直說“CurrentActivity 不是封閉標簽” 這是代碼

  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();
        }


    }

這是適配器類

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);
        }
    }
}

這是模型類

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;
    }
}

有人可以幫助我更好地實現onClickListener嗎?

在您的適配器類中使用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);
        }
    })

並刪除了這段代碼,因為您需要在 RecyclerView 中的各個視圖上設置單擊偵聽器,而不是整個 RecyclerView。

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

您還可以將 View.onClickListener 發送到列表的構造函數,例如:

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

在您的活動中,您需要實現接口 View.onClickListener 並在

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

創建適配器時,請使用以下代碼:

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

            adapter = new UserAdapter(options,this);

您將 UserActivity 作為當前活動傳遞。 請將上下文傳遞給您的適配器構造函數。

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;
    }
}

為您的 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
        }
    });

在您定義適配器的活動中傳遞上下文。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM