Виден только выбранный элемент и скрыть видимые элементы в RecyclerView - PullRequest
1 голос
/ 27 мая 2019

У меня есть ImageView внутри предмета в RecyclerView.Каждый раз, когда я нажимаю на элемент, я хочу, чтобы изображение стало видимым, а изображение предыдущего нажатого элемента стало невидимым.

public static class MyHolder extends RecyclerView.ViewHolder {

    private ImageView image_view;
    private TextView text_view_name;
    private TextView text_view_abilities;
    private ImageView heart_image_view;

    public MyHolder(@NonNull final View itemView, final OnItemClickListener listener) {
        super(itemView);

        image_view = itemView.findViewById(R.id.image_view);
        text_view_name = itemView.findViewById(R.id.text_view_name);
        text_view_abilities = itemView.findViewById(R.id.text_view_abilities);
        heart_image_view = itemView.findViewById(R.id.heart_image_view);
        heart_image_view.setImageResource(R.drawable.heart);
        heart_image_view.setVisibility(View.GONE);

        itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (listener != null) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION) {
                    listener.onItemClick(position);
                    heart_image_view.setVisibility(View.VISIBLE);
                }
            }
        });
    }
}

@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.single_item_layout, viewGroup, false);
    MyHolder holder = new MyHolder(v, mlistener);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull MyHolder myHolder, int position) {

    Item item = myList.get(position);
    myHolder.text_view_name.setText(item.getTitle());

    stringArray = item.getAbilitiesObj();
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < stringArray.size(); i++) {
        try {
            builder.append(stringArray.get(i));
            builder.append(", ");

        } catch (NumberFormatException ex) {
            ex.printStackTrace();
        }
        myHolder.text_view_abilities.setText(builder);
    }
    if (myHolder.image_view != null) {
        String photoUrl = item.getImageUrl();
        Picasso.with(mContext).load(photoUrl).into(myHolder.image_view);
    }
}

В MyHolder классе, где item.setOnClick, я устанавливаю изображение выбранного элемента видимымно затем каждый раз, когда я нажимаю на другой элемент, изображение нового элемента становится видимым, а изображение предыдущего элемента не становится невидимым.

1 Ответ

0 голосов
/ 27 мая 2019

В вашем адаптере должен быть другой массив целых чисел, чтобы отслеживать элементы, по которым щелкают.Сначала инициализируйте массив целых чисел всеми.

// Define an array like the following in your adapter 
private int[] selectedItems = new int[yourDataList.size()]; // Initialize the array to have the same size as your data list.

Затем инициализируйте массив со всеми.Попробуйте использовать такую ​​функцию в своем адаптере.

private void initializeSeledtedItems() {
    for(int item : selectedItems) item = 1;
} 

Теперь в вашем onBindViewHolder установите видимость ImageView в ваших RecyclerView элементах на основе значения, найденного в массиве selectedItems.

if(selectedItems[position] == 1) heart_image_view.setVisibility(View.VISIBLE);
else heart_image_view.setVisibility(View.GONE);

В onClickListener измените массив selectedItems так, чтобы только выбранный элемент имел значение один, а все остальные - нули.Затем позвоните notifyDataSetChanged, чтобы изменения вступили в силу.

private void setSelectedItem(int position) {
    for(int i = 0; i < selectedItems.length(); i++) {
        if(i == position) selectedItems[i] = 1;
        else selectedItems[i] = 0;
    }
} 

itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        if (listener != null) {
            int position = getAdapterPosition();
            if (position != RecyclerView.NO_POSITION) {
                setSelectedItem(position);
                notifyDataSetChanged();
            }
        }
    }
});

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...