0

Я пользуюсь библиотекой CircularImageView. У меня есть CircularImageView в моем ViewHolder, и я хочу изменить его цвет границы по щелчку.Настройка CircularImageView цвет границы программно

Мои onBindViewHolder:

public void onBindViewHolder(ThumbnailAdapter.ViewHolder holder, int position) { 
     ... //getting the relevant user from dataset and other irrelevant stuff 

     if(selectedUsers.size() == 0 || selectedUsers.contains(user)) { 
      holder.thumbnail.setBorderColor(R.color.selected); 
     } else { 
      holder.thumbnail.setBorderColor(R.color.not_selected); 
     } 

     holder.thumbnail.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (selectedUsers.contains(user)) { 
        selectedUsers.remove(user); 
       } else { 
        selectedUsers.add(user); 
       } 

       notifyDataSetChanged(); 
      } 
     }); 
} 

Странная вещь, что первые окрасочные работы (граница цвет действительно не один предопределены в XML), но дальнейшее изменение не влияет на вид (хотя событие вызывается и значение изменяется). Я попытался изменить также применимый для устранения проблемы с RecyclerView, и он работает так, как ожидалось.

Я делаю что-то неправильно? Может быть, в библиотеке есть ошибка (если так, я не мог ее найти)? Любая помощь будет оценена!

EDIT: Более адаптер код:

public ThumbnailAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.thumbnail, parent, false); 
     return new ThumbnailAdapter.ViewHolder(v); 
    } 

static class ViewHolder extends RecyclerView.ViewHolder { 
     CircularImageView thumbnail; 

     ViewHolder(View v) { 
      super(v); 
      thumbnail = (CircularImageView) v.findViewById(R.id.user_thumbnail); 
     } 
    } 

private List<User> mDataSet; 
private List<User> selectedUsers; 

public ThumbnailAdapter(List<User> dataSet) { 
     mDataSet = dataSet; 
     selectedUsers = new ArrayList<>(); 
    } 

Установка адаптера:

 mAdapter = new ThumbnailAdapter(users); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)); 
     mRecyclerView.setAdapter(mAdapter); 
+0

Вы могли бы оставить остальную часть кода адаптера? самое главное, onCreateViewHolder, а также код VH – HenriqueMS

+1

@goldenb Добавлено. Я отклонил нерелевантный код, как общение с родительской деятельностью. –

+0

Вы могли бы разместить сообщение «... // получение соответствующего пользователя из набора данных и других нерелевантных материалов»? – HenriqueMS

ответ

1

Я получил это работает, попробуйте следующее:

enter image description here

public void onBindViewHolder(RecyclerView.ViewHolder mholder, int position) { 

     final User user = mList.get(position); 


     final ViewHolder holder = (ViewHolder) mholder; 

     if(selectedUsers.size() == 0 || selectedUsers.contains(user)) 
     { 
      //holder.thumbnail.setBorderColor(Color.GREEN); 

      setBorder(holder.thumbnail, true); 
     } else { 
      //holder.thumbnail.setBorderColor(Color.RED); 
      setBorder(holder.thumbnail, false); 

     } 

     holder.thumbnail.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (selectedUsers.contains(user)) { 
        selectedUsers.remove(user); 
       } else { 
        selectedUsers.add(user); 
       } 

       //notifyItemChanged(position); 
       notifyDataSetChanged(); 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return mList.size(); 
    } 

    public void setBorder(CircularImageView circularImageView, boolean selected) { 

     // Set Border 
     if(selected) { 
      circularImageView.setBorderColor(context.getResources().getColor(R.color.colorPrimary)); 
      circularImageView.setBorderWidth(50); 
      circularImageView.setBackgroundColor(0xffffffff); 
     } 
     else 
     { 
      circularImageView.setBorderColor(context.getResources().getColor(R.color.colorAccent)); 
      circularImageView.setBorderWidth(50); 
      circularImageView.setBackgroundColor(0xffffffff); 
     } 
// Add Shadow with default param 
     //circularImageView.addShadow(); 
// or with custom param 
     //circularImageView.setShadowRadius(1); 
     //circularImageView.setShadowColor(Color.WHITE); 
    } 

Что-то еще нужно сделать для повышения производительности: смотрите внутри View.OnClickListener() переключателя notifyDataSetChanged() который заставит полный полный макет на LayoutManager для метода прецизионного notifyItemChanged(position); который будет выполнять задачу, которую вы хотите без перерисовки все,

Надеется, что это помогает ! =)

+0

@NeriaNachum вы смогли решить вашу проблему? дайте мне знать, если это помогло =) – HenriqueMS

+1

Спасибо за вашу помощь, это работает (я честно понятия не имею, почему мой оригинальный код не работал, поскольку он кажется довольно похожим). Что касается уведомления, мне нужно уведомить весь набор данных, поскольку все элементы затронуты при изменении от 1 до 0 (или от 0 до 1). –

+1

Да, ваш начальный код выглядел нормально, поэтому я сначала тестировал его со стандартным представлением (стандартный ImageView в этом случае), и он работал, поэтому ваш код адаптера был в порядке, как я думал. Затем я был вынужден проверить конкретную библиотеку, которую вы хотели, и получил тот же результат.Я заметил на странице проекта github, что они очень специфичны в отношении того, как мы должны создавать View и voila, используя их методы настройки. Подводя итог, в моей работе я не делаю никаких предположений при использовании кода, который я лично не тестировал x'D cheers mate – HenriqueMS

Смежные вопросы