2016-05-27 2 views
0

Я использую AndroidSwipeableCardStack, чтобы сделать такой интерфейс, как 5-ти звездная система. Когда я нажимаю кнопку, предназначенную для изменения изображения. Изображение сменит три карты позже не на текущей карте.Android: setImageResource в сменном адаптере изображения 3 позиции позже

Это проект, который я использовал: https://github.com/wenchaojiang/AndroidSwipeableCardStack

Я предполагаю, что делать с ней предварительно загрузить следующую карту как recyclerview обычно делает, но я действительно не уверен.

Этот мой переходник ниже, вы можете видеть внизу, я вызываю setimageresource на одноименную кнопку изображения рейтинга onclicklistner. Я установил Log.d, и щелчок кнопки регистрируется сразу после клика, но изменение ресурса изображения появляется только после того, как были извлечены 3 карты.

Редактировать: Поэтому я заметил, что независимо от проекта, который я импортировал, мой адаптер расширяет только ArrayAdatper. Поэтому я догадался, что проблема может быть в методе getView и что мне может потребоваться переопределить что-то еще (не уверен). Но важный момент, я проверил позицию в getView, запустив позицию и, конечно же, сказал, что она имеет значение 0,1,2,3, и ничего не вытащили. Это аналогично смещению setImageResource, поэтому я считаю, что они взаимосвязаны, но, к сожалению, это не приближает меня к ответу.

Благодарим за помощь.

public class SongPreviewCardsDataAdapter extends ArrayAdapter<SongDatabaseMappingAdapter> { 

    public SongPreviewCardsDataAdapter(Context context, int resource) { 
     super(context, resource); 
    } 
    ImageButton oneStarRating; 

    @Override 
    public View getView(int position, final View contentView, ViewGroup parent) { 

     // Initialise Song Views 
     SongDatabaseMappingAdapter item = getItem(position); 

     TextView songName = (TextView) (contentView.findViewById(R.id.songNameTextView)); 
     songName.setText(item.getSongTitle()); 

     com.mikhaellopez.circularimageview.CircularImageView songImage = (CircularImageView) contentView.findViewById(R.id.songImageView); 
     String ImageURL = (item.getPictureURL()); 

     Picasso 
       .with(this.getContext()) 
       .load(ImageURL) 
       .into(songImage); 

     // Initialise Rating Buttons 
     oneStarRating = (ImageButton) contentView.findViewById(R.id.ratingButton1); 

     // Create OnClickListners for Ratings Buttons 
     oneStarRating.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       oneStarRating.setImageResource(R.drawable.starfull); 
       Log.d("Star", "Star Clicked"); 

      } 
     }); 

     return contentView; 

    } 

} 

ответ

1

getView можно вызвать в любое время и по любому вопросу, так что если вы хотите что-то, чтобы остаться установить на вид, вы должны моделировать его.

Я не знаю, может ли ваш класс SongDatabaseMappingAdapter вы можете изменить или нет, но я предполагаю, что вы можете его изменить.

  • Добавить переменную в класс товаров, например boolean mOneStar. Getter/setter оставил упражнение для читателя.

  • В getView() сделать ваш деталь final так что вы можете обратиться к нему в onClick обратного вызова:

    final SongDatabaseMappingAdapter item = getItem(position); 
    
  • Используйте переменную в getView, чтобы настроить вид:

    oneStarRating = (ImageButton) contentView.findViewById(R.id.ratingButton1); 
        oneStarRating.setImageDrawable(null); // clear out recycled value 
        if (item.isOneStar()) { 
         oneStarRating.setImageResource(R.drawable.starfull); 
        } 
    
  • В ваш OnClickListener, задайте объект на продажу и позвоните notifyDataSetChanged():

    oneStarRating.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
    
          Log.d("Star", "Star Clicked"); 
          item.setOneStar(true); 
          notifyDataSetChanged(); 
         } 
        }); 
    

Главное, Никогда не изменить вид из обработчика события. Всегда меняйте элемент из обработчика события, затем вызывайте adapter.notifyDataSetChanged() и всегда меняйте свое мнение в getView() на основе элемента.

+0

Спасибо, что ответили. Я понимаю до последней части. Я создал getter/setter, я изменил метод getView с помощью оператора if. Это прекрасно работает. То, что сейчас озадачило меня, - это сделать OnClickListner. Это CardStack. В моем createView я делаю следующее: mCardStack = (CardStack) view.findViewById (R.id.cardstackcontainer); и, как вы сказали, я могу сделать mCardStack.setOnClickListener(); Однако не уверен, как это изменит звезду, если щелкнуть звезду (будет 5 звезд). Изменит ли это изменение звезды, если в любой точке карты будет нажата кнопка? –

+0

Извините, я не понимал, что 'CardStack' фактически был списком. См. Мой обновленный ответ. –

+0

Огромное вам спасибо, что убил меня. Мне нужно было внести два изменения, чтобы заставить его работать (и это, вероятно, практика на пэде), поэтому, пожалуйста, дайте мне знать, если и как мне нужно их изменить. Когда я объявлял getOneStar/setOneStar, я должен был сказать, что он был ложным, или я получил нулевой указатель, а также где вы помещаете oneStarRating.setImageDrawable (null); Мне пришлось прокомментировать это, потому что снова я получил ошибку nullpointer. независимо от того, работает он Спасибо! –

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