2016-05-27 1 views
0

私は5つ星評価システムとのインタフェースのような火口を行うためにAndroidSwipeableCardStackを使用しています。画像を変更するボタンをクリックしたとき。イメージは現在のカードではなく3枚後に変更されます。アンドロイド:アダプターでsetImageResource変更画像3位以降の

これは私が使用したプロジェクトです:https://github.com/wenchaojiang/AndroidSwipeableCardStack

私はそれがrecyclerviewは通常どおり、それは次のカードを事前にロードして実行することですと仮定が、私は本当にわかりません。以下

この私のアダプタでは、あなたは、私は1つ星の評価画像ボタンonclicklistnerにsetimageresourceを呼び出す下部に見ることができます。私は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を作成し、if文でgetViewメソッドを変更しました。これは完全に機能しています。今私が困惑しているのはOnClickListnerのやり方です。それはCardStackです。私のcreateViewで私は以下を行います:mCardStack =(CardStack)view.findViewById(R.id.cardstackcontainer);あなたが言ったように私はmCardStackを行うことができます。setOnClickListener();しかし、スター自体がクリックされた場合、星がどのように変化するかは分かりません(5つの星があります)。カード上のどこかをクリックすると星が変わるのだろうか? –

+0

申し訳ありませんが、私は 'CardStack'が実際にはリストそのものであることを理解していませんでした。私の更新された答えを見てください。 –

+0

私を殺してくれてありがとう、ありがとう。私はそれを働かせるために2つの変更を加えなければなりませんでした(そしてこれらはおそらくパッドの練習です)ので、私はそれらを変更する必要があるかどうか、私に教えてください。私がgetOneStar/setOneStarを宣言したとき、私は実際にそれが偽であると言わなければなりませんでした。あるいは、私はnullポインタを持っていました。そして、あなたがoneStarRating.setImageDrawable(null)を置く場所もあります。私は再びそれがnullpointerエラーを持っているので、それをコメントしなければならなかった。関係なく、それは働いているありがとう! –

関連する問題