私は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);
}
}
}
外部のものではなく、onCreateViewHolderのバックエンドにクエリを実行して、コンストラクタまたはセッターを介してアダプタに応答を渡すべきではありません。私の例を確認してください。strightforwardです。 –
onCreateViewholderのバックエンドレスデータを照会したいリストが上下にスクロールされるたびに更新されることはありません(私はRecyclerViewの仕組みを知っています...ここでいくつかの運をしようとしました)。もし私がonBindViewHolderにクエリコードを置くと、イメージドロアブルは全ての行に対して空であり、3/4秒後に行を見ていると更新されます(データのクエリに時間がかかります)。スクロールアップ/ダウンを行うたびに更新されないようにしています。 – Asama
"onCreateViewholderのバックエンドレスデータをクエリして、リストが上下にスクロールされるたびに更新されないようにしたい"..あなたが間違っていると思います。あなたはonCreateViewholderの中でバックエンドを呼び出す必要はありません。外部に呼び出すと、アダプタ内の変数に応答を格納します(私の例では醸造所)。次に、onBindViewHolderを使用してビューをリフレッシュします。 –