Текущая запись Recycle View не может перенести правильные данные в другое действие - PullRequest
0 голосов
/ 26 июня 2019

Я использую recycle view для отображения сообщений пользователей. Я создаю кнопку в каждом сообщении просмотра корзины. Когда пользователь нажимает на эту кнопку, все данные этого сообщения будут перенесены в другой вид деятельности. Моя проблема в том, что когда я нажимаю на кнопку сообщения, перенесенные данные не являются данными этого сообщения. Например, когда я нажимаю кнопку сообщения 1, данные сообщения 2 переносятся в новую активность вместо данных сообщения 1. Может кто-нибудь помочь мне решить эту проблему? Заранее спасибо

Ниже представлен мой адаптер Recycle View:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ImageViewHolder> {

    private Context context;
    private List<Upload> uploads;
    Upload uploadCurrent;

    private String userEmail, locationName, locationType, locationAddress,
            userComment, downloadUrl, userLatitude, userLongitude;

    public CustomAdapter(Context context, List<Upload> uploads) {
        this.context = context;
        this.uploads = uploads;
    }

    @NonNull
    @Override
    public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.custom_view, parent, false);
        return new ImageViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
        uploadCurrent = this.uploads.get(position);

        userEmail = uploadCurrent.getUserEmail();
        locationName = uploadCurrent.getLocationName();
        locationType = uploadCurrent.getLocationType();
        locationAddress = uploadCurrent.getLocationAddress();
        userComment = uploadCurrent.getUserComment();
        downloadUrl = uploadCurrent.getDownloadUrl();
        userLatitude = uploadCurrent.getUserLatitude();
        userLongitude = uploadCurrent.getUserLongitude();

        holder.emailCustom.setText(userEmail);
        holder.nameCustom.setText(locationName);
        holder.commentCustom.setText("Review: " + userComment );
        holder.typeCustom.setText("Type: "+ locationType );
        holder.addressCustom.setText("Address: " + locationAddress);
        Picasso.get().load(downloadUrl).fit().centerCrop().into(holder.imageCustom);

        //handle button
        holder.saveCustomButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(context, SaveActivity.class);
                intent.putExtra("adap_name", locationName);
                intent.putExtra("adap_address", locationAddress);
                intent.putExtra("adap_type", locationType);
                intent.putExtra("adap_comment", userComment);
                intent.putExtra("adap_image", downloadUrl);
                intent.putExtra("adap_latitude", userLatitude);
                intent.putExtra("adap_longitude", userLongitude);

                context.startActivity(intent);
            }
        });

    }

    @Override
    public int getItemCount() {
        return this.uploads.size(); //how many items in our uploads list
    }


    public class ImageViewHolder extends RecyclerView.ViewHolder {

        public TextView emailCustom;
        public TextView nameCustom;
        public TextView commentCustom;
        public TextView typeCustom;
        public TextView addressCustom;
        public ImageView imageCustom;
        public Button saveCustomButton;


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

            emailCustom = itemView.findViewById(R.id.emailCustom);
            nameCustom = itemView.findViewById(R.id.nameCustom);
            typeCustom = itemView.findViewById(R.id.typeCustom);
            addressCustom = itemView.findViewById(R.id.addressCustom);
            commentCustom = itemView.findViewById(R.id.commentCustom);
            imageCustom = itemView.findViewById(R.id.imageCustom);
            saveCustomButton = itemView.findViewById(R.id.saveCustomButton);

        }
    }
}

Ответы [ 4 ]

2 голосов
/ 26 июня 2019

вы инициализируете строку глобально, поэтому они принимают последнее значение из списка, инициализируйте их в ImageViewHolder, который будет работать для вас

открытый класс ImageViewHolder расширяет RecyclerView.ViewHolder {

    public TextView emailCustom;
    public TextView nameCustom;
    public TextView commentCustom;
    public TextView typeCustom;
    public TextView addressCustom;
    String userEmail, locationName, locationType, locationAddress,
        userComment, downloadUrl, userLatitude, userLongitude;
2 голосов
/ 26 июня 2019

Просто поместите ваш clicklistener из onBindViewHolder метода в ImageViewHolder класс и используйте метод размещения адаптера:

    holder.saveCustomButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            uploadCurrent = uploads.get(getAdapterPosition());
            Intent intent = new Intent(context, SaveActivity.class);
            intent.putExtra("adap_name", uploadCurrent.getlocationName());
            context.startActivity(intent);
        }
    });

Повторите то же самое для получения других атрибутов.

0 голосов
/ 26 июня 2019

Не происходит ли сбой при нажатии кнопки на последнем элементе в представлении переработчика?Если это так, то, возможно, ваш индекс вышел за границы.

0 голосов
/ 26 июня 2019

Cool!В вашем адаптере просто выполните следующие действия

Kotlin

override fun getItemId(position: Int): Long {
return position.toLong()}



override fun getItemViewType(position: Int): Int {
 return position}

Java

@Override
public Long getItemId(int position) {
 return position;
}

@Override
public int getItemViewType(int position) {
 return position;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...