2016-03-19 4 views
0

Я хочу изменить один элемент (ImageView) в определенной строке ListView. Теперь я попробовал изменить его через onItemClickListener, чтобы просмотреть его. Он также работает!Изменить один элемент ListView

Но как-то, когда я прокручиваю вверх и вниз, другие строки списка также меняются. Я нашел что-то о проблеме "view recycling", но я действительно не нашел для нее решения.

Кому-то может помочь?

EDIT: Некоторые код здесь:

Мой СЛУШАТЕЛЬ:

LV.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     ... 
     updateEQAnimation(position,view); 
     ... 
     } 

Функция, которая должна изменить его метод

private void updateEQAnimation(int index, View view){ 

    ColorStateList sColorStatePlaying; 
    ColorStateList sColorStateNotPlaying; 

    sColorStatePlaying = ColorStateList.valueOf(context.getResources().getColor(R.color.colorPrimary)); 

    if(view == null) 
     return; 
    AnimationDrawable animation = (AnimationDrawable) ContextCompat.getDrawable(context, R.drawable.anim_current_song); 
    ImageView EQ_ANIM = (ImageView) view.findViewById(R.id.imageView_eq_animation); 
    EQ_ANIM.setVisibility(View.VISIBLE); 
    EQ_ANIM.setImageDrawable(animation); 
    EQ_ANIM.setImageTintList(sColorStatePlaying); 
    animation.start();} 

GetView:

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View rview = view; 
    holder = null; 

    if (rview == null) 
    { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     rview= inflater.inflate(R.layout.row_song, null, true); 
     holder = new ViewHolder(rview); 
     rview.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) rview.getTag(); 
    } 

    mArtLoader.loadBitmap(AL_songlist.get(position).getAlbumArtPath(), holder.imgAlbumart); 
    holder.txtTitle.setText(AL_songlist.get(position).getTitle()); 
    holder.txtArtist.setText(AL_songlist.get(position).getArtist()); 

    if(Main.songService.svc_mpcontroller != null && Main.global_music_controller != null) { 
     if (AL_songlist.get(position).getID() == Main.global_music_controller.get_current_id()) { 
      ColorStateList sColorStatePlaying; 
      ColorStateList sColorStateNotPlaying; 

      sColorStatePlaying = ColorStateList.valueOf(context.getResources().getColor(R.color.colorPrimary)); 
      AnimationDrawable animation = (AnimationDrawable) ContextCompat.getDrawable(context, R.drawable.anim_current_song); 
      holder.imgEQAnimation.setVisibility(View.VISIBLE); 
      holder.imgEQAnimation.setImageDrawable(animation); 
      holder.imgEQAnimation.setImageTintList(sColorStatePlaying); 
      animation.start(); 
     } 
    } 

    return rview; 
} 
+0

Вы должны использовать getItemId() для элемента, который вы хотите изменить, а затем работать над этим идентификатором при дальнейших действиях. –

+0

Я отредактировал и разместил мой код в настоящее время –

+0

Onur kardes. getItemId hep ayni int geri veriyo. –

ответ

1

Сначала я объясню, как перерабатывать вид, а затем я перейду к вашей проблеме. Скажем, вы можете одновременно просмотреть 8 элементов списка на экране. Когда вы прокручиваете список вниз, а номер позиции 1 уходит с экрана, а на экране появляется номер позиции 10, номер позиции 10 будет повторно использовать вид позиции номер 1. Это означает, что номер позиции 10 будет выглядеть точно так же, как номер позиции 1, если вы не обновите его соответствующим образом в своих адаптерах getView.

Теперь, когда мы понимаем, что вы пересматриваете переработку, вы можете увидеть, почему другие предметы будут иметь ваши новые возможности, даже если вы их не нажимали. Вам нужно будет хранить в своем наборе данных, который вы используете для своего адаптера, элементы которого имеют это изображение, будь то ArrayList в адаптере, или это пользовательский объект, который использует адаптер. Тогда в getView вашего адаптера вы можете сделать следующее:

if(hasImage) 
{ 
    ColorStateList sColorStatePlaying; 
    ColorStateList sColorStateNotPlaying; 

    sColorStatePlaying = ColorStateList.valueOf(context.getResources().getColor(R.color.colorPrimary)); 
    AnimationDrawable animation = (AnimationDrawable) ContextCompat.getDrawable(context, R.drawable.anim_current_song); 
    ImageView EQ_ANIM = (ImageView) view.findViewById(R.id.imageView_eq_animation); 
    EQ_ANIM.setVisibility(View.VISIBLE); 
    EQ_ANIM.setImageDrawable(animation); 
    EQ_ANIM.setImageTintList(sColorStatePlaying); 
    animation.start(); 
} 
else 
{ 
    // Set the default image 
} 

Edit: Вы должны добавить еще заявление в вашем getView

if(Main.songService.svc_mpcontroller != null && Main.global_music_controller != null) { 
     if (AL_songlist.get(position).getID() == Main.global_music_controller.get_current_id()) { 
      ColorStateList sColorStatePlaying; 
      ColorStateList sColorStateNotPlaying; 

      sColorStatePlaying = ColorStateList.valueOf(context.getResources().getColor(R.color.colorPrimary)); 
      AnimationDrawable animation = (AnimationDrawable) ContextCompat.getDrawable(context, R.drawable.anim_current_song); 
      holder.imgEQAnimation.setVisibility(View.VISIBLE); 
      holder.imgEQAnimation.setImageDrawable(animation); 
      holder.imgEQAnimation.setImageTintList(sColorStatePlaying); 
      animation.start(); 
     } 
    } 
    else 
     holder.imgEQAnimation.setVisibility(View.GONE); 
+0

hmmm ... Хорошо, я попробую. Поэтому, если я правильно понял, я мог бы составить список, где, например, я ставлю логические значения (default = all false). И тот, кого я нажал, должен сделать правду. И тогда я должен проверять его каждый раз в getView, если list.get (position) истинно или нет? Правильно ли я это понял? –

+0

Да, как это работает. Каков ваш набор данных адаптеров в настоящее время? Если вы должны были вызвать list.get (position), что бы он вернулся? – Dom

+0

У меня все еще такая же проблема. Мой набор данных - это настраиваемый массив объектов, в котором одно из них имеет логическое значение, которое показывает, что изображение должно быть изменено. –

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