滚动时,Android Horizo​​ntal RecylerView与适配器上的最后一项显示相同的项目

时间:2018-06-29 13:22:20

标签: android android-recyclerview

我需要一些帮助。 所以我需要从Firebase获取数据列表并将其放在水平recylerview中。下面是代码,我已经仔细检查了一下,代码返回了正确的数据。

private void loadtags() {
    mDatabase.child("tags")
            .orderByChild("total")
            .limitToLast(8).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<Tags> tagsmodel = new ArrayList<>();
            for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
                Tags tags = userSnapshot.getValue(Tags.class);
                tagsmodel.add(userSnapshot.getValue(Tags.class));
            }
            mAdaptertags.addAll(tagsmodel);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.d(TAG, "database error : " + databaseError);
        }
    });
}

以上代码产生了以下数据: tag10,tag2,tag5,tag6,pengumuman,编程,stikom,html

然后将数据放入recyclerview。下面是代码

mAdaptertags = new RecyclerViewAdapter_itemchiptags();
LinearLayoutManager mLayoutManagertags = new LinearLayoutManager(getActivity().getApplicationContext(), LinearLayoutManager.HORIZONTAL, true);
resekeltags.setLayoutManager(mLayoutManagertags);
resekeltags.setAdapter(mAdaptertags);
loadtags();

问题是,首先(在我滚动recylerview之前)数据的顺序是这样的: tag10,tag2,tag5,tag6,pengumuman,编程,stikom,html

在我滚动它之后,第一个数据tag10变成了html。

为什么变了?

更新 这是我的观看者代码

class MyViewHolder extends RecyclerView.ViewHolder {
        Chip tagname;

        MyViewHolder(View view) {
            super(view);
            tagname = (Chip) view.findViewById(R.id.item_chiptags);
        }


        public void setData(final Tags tag, int posisi) {
            try {
                color = MaterialPalettes.INSTANCE.getRandomColorByLevel(MaterialPalettes.INSTANCE.getLEVEL_700());
            } catch (IllegalAccessException e) {
                Log.d(TAG, "error warna : " + e);
                e.printStackTrace();
            }

            if(posisi != tagsList.size()-1){
                tagname.setChipText(tag.getKey()+" "+posisi);
                tagname.changeBackgroundColor(ContextCompat.getColor(getApplicationContext(), color));}
        }

    }

这是我的适配器代码

public RecyclerViewAdapter_itemchiptags() {
        this.tagsList = new ArrayList<>();
    }

    @Override
    public RecyclerViewAdapter_itemchiptags.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new MyViewHolder(LayoutInflater.from(parent.getContext())
                .inflate(R.layout.itemtags, parent, false));
    }

    @Override
    public void onBindViewHolder(RecyclerViewAdapter_itemchiptags.MyViewHolder holder, int position) {
        holder.setData(tagsList.get(position), position);
    }

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

    public void addAll(List<Tags> tags) {
        int initialSize = tagsList.size();
        tagsList.addAll(tags);
        notifyItemRangeInserted(initialSize, tags.size());
    }

2 个答案:

答案 0 :(得分:0)

尝试如下更改initialSize

 public void addAll(List<Tags> tags) {
    int initialSize = tagsList.size()+1; //change here
    tagsList.addAll(tags);
    notifyItemRangeInserted(initialSize, tags.size());
}

答案 1 :(得分:0)

问题在于以下几行:

 if(posisi != tagsList.size()-1){
                tagname.setChipText(tag.getKey()+" "+posisi);
                tagname.changeBackgroundColor(ContextCompat.getColor(getApplicationContext(), color));}
        }

在此条件仅在适配器到达最后一项时通过。 如果size = 10,则size-1 = 9:

(大小-1)!=位置或9!= 9