2016-04-25 16 views
0

私はrecyclerviewに問題があります。下にスクロールするとすべてがOKですが、上にスクロールすると、イメージに設定されているドロアブルが変更されています。 ここに私のアダプタのコードです:RecyclerView itemスクロール時にイメージ描画可能なイメージを表示します。

@Override 
    public FeedsHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.feed_item, parent, false); 

     final FeedsHolder holder = new FeedsHolder(view); 

     //Query 

     QueryOptions options = new QueryOptions(); 

     options.setRelated(Arrays.asList("usersThatLike")); 

     BackendlessDataQuery query = new BackendlessDataQuery(); 

     query.setQueryOptions(options); 

     Backendless.Data.of(Feeds.class).find(query, new AsyncCallback<BackendlessCollection<Feeds>>() { 

      @Override 

      public void handleResponse(BackendlessCollection<Feeds> response) { 
       String userId = Backendless.UserService.CurrentUser().getObjectId(); 
       for (Feeds feed : response.getData()) { 
        feed = list.get(holder.getAdapterPosition()); 

        List<BackendlessUser> likedUsers = feed.getUsersThatLike(); 
        for (BackendlessUser user : likedUsers) 
         if (user.getObjectId().equals(userId)) { 
    //** GOOGLE MATERIAL ICON WITH FILLED HEART 
          setBackground(holder.like, ContextCompat.getDrawable(context, R.drawable.ic_favorite_black_24dp)); 
         } else if (!user.getObjectId().equals(userId)) { 
    //** GOOGLE MATERIAL ICON WITH EMPTY HEART 
          setBackground(holder.like, ContextCompat.getDrawable(context, R.drawable.ic_favorite_border_black_24dp)); 
         } 
       } 

      } 

      @Override 

      public void handleFault(BackendlessFault backendlessFault) { 

      } 

     }); 
     return holder; 
    } 

そして、私はonBindViewHolderでholder.like ImageViewのデフォルトの画像設定より:

@Override 
    public void onBindViewHolder(final FeedsHolder holder, final int position) { 
     holder.like.setBackground(ContextCompat.getDrawable(context, R.drawable.ic_favorite_border_black_24dp)); 
    } 

をそして、私は、これが問題だと思う...

は、しかし、私はこれを解決する方法を知らない。なぜなら、このコード行がないと、私の他の行のrecyclerviewは異なるイメージを持つだろうから、いくつかは心が満たされ、いくつかは空になるからだ。

解決策を見つけるのを手伝ってください。

EDIT:は私のアダプターコード

public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.FeedsHolder> { 

    private List<Feeds> list; 
    private Context context; 
    private static List<Long> selectedIds; 
    List<BackendlessUser> backendlessUserList; 
    private List<Comments> cake = new ArrayList<>(); 
    private static String TAG = "MainActivity"; 

    public FeedAdapter(Context context, List<Feeds> list) { 
     this.context = context; 
     this.list = list; 

    } 

    @Override 
    public FeedsHolder onCreateViewHolder(ViewGroup parent, final int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.feed_item, parent, false); 

     final FeedsHolder holder = new FeedsHolder(view); 

     //Query 

     QueryOptions options = new QueryOptions(); 

     options.setRelated(Arrays.asList("usersThatLike")); 

     BackendlessDataQuery query = new BackendlessDataQuery(); 

     query.setQueryOptions(options); 

     Backendless.Data.of(Feeds.class).find(query, new AsyncCallback<BackendlessCollection<Feeds>>() { 

      @Override 

      public void handleResponse(BackendlessCollection<Feeds> response) { 
       myFeeds = response; 
       String userId = Backendless.UserService.CurrentUser().getObjectId(); 
       for (Feeds feed : response.getData()) { 
        feed = list.get(holder.getAdapterPosition()); 

        List<BackendlessUser> likedUsers = feed.getUsersThatLike(); 
        backendlessUserList = likedUsers; 
        for (BackendlessUser user : likedUsers) 
         if (user.getObjectId().equals(userId)) { 
          setBackground(holder.like, ContextCompat.getDrawable(context, R.drawable.ic_favorite_black_24dp)); 
         } else if (!user.getObjectId().equals(userId)) { 
          setBackground(holder.like, ContextCompat.getDrawable(context, R.drawable.ic_favorite_border_black_24dp)); 
         } 
       } 

      } 

      @Override 

      public void handleFault(BackendlessFault backendlessFault) { 

      } 

     }); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(final FeedsHolder holder, final int position) { 
     //Starting Feeds 
     final Feeds feeds = list.get(position); 

     holder.like.setBackground(ContextCompat.getDrawable(context, R.drawable.ic_favorite_border_black_24dp)); 

     //Name 
     holder.name.setText(feeds.getOwner()); 

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

    public class FeedsHolder extends RecyclerView.ViewHolder { 
     //Setup Views 
     CardView card; 
     TextView name; 

     public FeedsHolder(View itemView) { 
      super(itemView); 

      //Assign views by ID 
      card = (CardView) itemView.findViewById(R.id.cv); 
      name = (TextView) itemView.findViewById(R.id.commenter); 
     } 
    } 
} 
+0

外部のものではなく、onCreateViewHolderのバックエンドにクエリを実行して、コンストラクタまたはセッターを介してアダプタに応答を渡すべきではありません。私の例を確認してください。strightforwardです。 –

+0

onCreateViewholderのバックエンドレスデータを照会したいリストが上下にスクロールされるたびに更新されることはありません(私はRecyclerViewの仕組みを知っています...ここでいくつかの運をしようとしました)。もし私がonBindViewHolderにクエリコードを置くと、イメージドロアブルは全ての行に対して空であり、3/4秒後に行を見ていると更新されます(データのクエリに時間がかかります)。スクロールアップ/ダウンを行うたびに更新されないようにしています。 – Asama

+0

"onCreateViewholderのバックエンドレスデータをクエリして、リストが上下にスクロールされるたびに更新されないようにしたい"..あなたが間違っていると思います。あなたはonCreateViewholderの中でバックエンドを呼び出す必要はありません。外部に呼び出すと、アダプタ内の変数に応答を格納します(私の例では醸造所)。次に、onBindViewHolderを使用してビューをリフレッシュします。 –

答えて

0

を投稿あなたはどこか(例えば表示する必要があるどのようなイメージ)セルの状態を維持する必要があります。 1つのオプションは、データソースと同じサイズのリストを持ち、その位置の要素が空の心臓、完全な心臓、または何も持たないかどうかを示す値を格納し、最後にその値をonBindViewHolderでチェックします。ビューを適切に更新します。

編集:ここでは例です:

public class BreweryRecyclerViewAdapter 
     extends RecyclerView.Adapter<BreweryRecyclerViewAdapter.BreweryRecyclerViewViewHolder> 
     implements View.OnClickListener { 

    private static List<Long> selectedIds; 

    private Context context; 
    private List<Brewery> breweries; 
    private View.OnClickListener clickListener; 

    public BreweryRecyclerViewAdapter(Context context) { 
     clearBreweries(); 
     this.context = context; 
    } 

    public BreweryRecyclerViewAdapter(List<Brewery> breweries) { 
     setBreweries(breweries); 
    } 

    public List<Brewery> getBreweries() { 
     return breweries; 
    } 

    public void setBreweries(List<Brewery> breweries) { 
     this.breweries = breweries; 
     selectedIds = new ArrayList<>(); 
    } 

    public void setClickListener(View.OnClickListener clickListener) { 
     this.clickListener = clickListener; 
    } 

    public void clearBreweries() { 
     this.breweries = Collections.emptyList(); 
     selectedIds = new ArrayList<>(); 
    } 

    @Override 
    public BreweryRecyclerViewViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater layoutInflater = LayoutInflater.from(context); 
     View itemView = layoutInflater.inflate(R.layout.item_brewery, parent, false); 
     itemView.setOnClickListener(this); 
     return new BreweryRecyclerViewViewHolder(context, itemView); 
    } 

    @Override 
    public void onBindViewHolder(BreweryRecyclerViewViewHolder holder, int position) { 
     Brewery brewery = breweries.get(position); 
     if (selectedIds.contains(brewery.getId())) { 
      holder.openSecondaryLayoutVisibility(); 
     } else { 
      holder.closeSecondaryLayoutVisibility(); 
     } 
     holder.update(brewery); 
    } 

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

    @Override 
    public void onClick(View view) { 
     if (clickListener != null) { 
      clickListener.onClick(view); 
     } 
    } 

    public static class BreweryRecyclerViewViewHolder extends RecyclerView.ViewHolder { 

     @BindView(R.id.brewery_name) 
     TextView breweryName; 

     @BindView(R.id.brewery_distance) 
     TextView breweryDistance; 

     @BindView(R.id.brewery_duration) 
     TextView breweryDuration; 

     @BindView(R.id.brewery_time) 
     TextView breweryTime; 

     @BindView(R.id.brewery_is_happy_hour) 
     ImageView breweryIsHappyHour; 

     @BindView(R.id.secondary) 
     RelativeLayout secondaryLayout; 

     @BindView(R.id.brewery_description) 
     TextView breweryDescription; 

     private Context context; 
     private Brewery brewery; 

     public BreweryRecyclerViewViewHolder(Context context, View itemView) { 
      super(itemView); 
      ButterKnife.bind(this, itemView); 
      this.context = context; 
     } 

     public Brewery getBrewery() { 
      return brewery; 
     } 

     public void toggleSecondaryLayoutVisibility(Long id) { 
      if (secondaryLayout.getVisibility() != View.VISIBLE) { 
       openSecondaryLayoutVisibility(); 
       selectedIds.add(id); 
      } else { 
       closeSecondaryLayoutVisibility(); 
       selectedIds.remove(id); 
      } 
     } 

     public void openSecondaryLayoutVisibility() { 
      secondaryLayout.setVisibility(View.VISIBLE); 
     } 

     public void closeSecondaryLayoutVisibility() { 
      secondaryLayout.setVisibility(View.GONE); 
     } 

     @OnClick(R.id.view_route_button) 
     public void viewRouteButtonClicked(Button button) { 
      String latitude = brewery.getLocation().getLatitude().toString(); 
      String longitude = brewery.getLocation().getLongitude().toString(); 
      Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(
        String.format("http://maps.google.com/maps?daddr=%s,%s", latitude, longitude))); 
      context.startActivity(intent); 
     } 

     public void update(Brewery brewery) { 
      breweryName.setText(brewery.getName()); 
      if (brewery.getDistanceHumanReadable() == null) { 
       breweryDistance.setVisibility(View.GONE); 
      } else { 
       breweryDistance.setText(String.format("%s | ", brewery.getDistanceHumanReadable())); 
       breweryDistance.setVisibility(View.VISIBLE); 
      } 
      if (brewery.getDurationHumanReadable() == null) { 
       breweryDuration.setVisibility(View.GONE); 
      } else { 
       breweryDuration.setText(String.format("%s | ", brewery.getDurationHumanReadable())); 
       breweryDuration.setVisibility(View.VISIBLE); 
      } 
      breweryTime.setText(String.format("%shs a %shs", brewery.getOpen(), brewery.getClose())); 
      breweryIsHappyHour.setVisibility(brewery.isHappyHour() ? View.VISIBLE : View.GONE); 
      breweryDescription.setText(brewery.getDescription()); 

      this.brewery = brewery; 
     } 

    } 

} 

は、細胞の状態を維持するためにselectedIdsの使用を確認するために、onBindViewHolder上とtoggleSecondaryLayoutVisibilityに注意を置きます。

+0

あなたは、セルの状態を維持するためのサンプルコードを提供していただけますか? – Asama

+0

確かに、私に数分を与えてください.. –

+0

あなたのサンプルコードありがとう。あなたの例ではsecondaryLayoutは何ですか?私のアダプターにはない非常に多くの機能があるので、理解しづらいです。あなたは私のフルコードをあなたに送ることができるように電子メールを送ってください。 – Asama

関連する問題