Намерение не работает в утилите - PullRequest
0 голосов
/ 21 февраля 2020

Я создал обзор реселлера, который отображает список пользователей из 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, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 21 февраля 2020

Вы также можете отправить View.onClickListener в конструктор списка, например:

View.onClickListener listener;

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);
0 голосов
/ 21 февраля 2020

Вы передаете 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;
    }
}

Установить контекст для вашей стартовой активности.

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 );
0 голосов
/ 21 февраля 2020

используйте holder.itemView.getContext() вместо UserActivity.this в вашем адаптере classs.

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);
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...