마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

RecyclerView item들이 재사용 될 때 문제

0 추천
RecyclerView 안에 item들이 추가되고 일정 수가 넘어갔을때 위 아래로 스크롤시에 item들이 순서가 뒤죽박죽으로 섞이는데 이걸 어떻게 해결해줘야하나요 ????

 

답변 부탁드립니다. setIsRecyclable(false); 제외하구 답변 부탁드립니다!!
알파고 (4,320 포인트) 님이 2017년 12월 21일 질문
코드를 보여주세요. 그럴리가 없습니다.
리싸이클러뷰는 뷰홀더패턴을 적용하기때문에 사용자 실수로도 섞일일은 없습니다.
윗분말씀대로 코드상에서 명시적 데이터바인딩이 되어 있지 않아서 제대로 표시되지 않을 가능성이 높네요.
코드를 올려보셔야할듯..33
뷰홀더에 제대로 적용하셨다면 안섞이고 제대로 출력될것입니다.
public AdapterActivity(Context context, List<Chat_room> items, int item_layout, String value) {

        this.context = context;
        this.items = items;
        this.item_layout = item_layout;
        this.name = value;
    }

    public int getItemViewType(int position) {


        if (items.get(position).getName().equals(name)) {
            //check = true;
            return 1;
        } else {
            // check = true;
            return 2;
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view;

        if (viewType == 1) {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_items, parent, false);
        } else {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_items_user, parent, false);
        }


        return new ViewHolder(view);

    }

    //@TargetApi(Build.VERSION_CODES.JELLY_BEAN)

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        downloadImageFile(imageFileName, holder);
    }

    public void downloadImageFile(String imageFileName, final ViewHolder holder)
    {

        storageRef = storage.getReference();
        pathReference = storageRef.child("images");

        storageReference = storageRef.child("images/" + imageFileName);

        try
        {
            localFile = File.createTempFile("images", "jpg");
            imagePath = localFile.getAbsolutePath();
        }
        catch (IOException e)
        {
            Log.i("FileDownload", e.toString());
        }

        storageReference.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                // Local temp file has been created

                Glide.with(holder.imagePicasso.getContext()).load(imagePath)
                        .override(500, 500)
                        .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .fitCenter()
                        .into(holder.imagePicasso);

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                // Handle any errors
            }
        });
      }


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

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView msg;
        ImageView imagePicasso;

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

            msg = (TextView)itemView.findViewById(R.id.chat_name);
            imagePicasso = (ImageView)itemView.findViewById(R.id.imagePicasso);
        }
    }
}

일단 Adapter activity 구요
public Chat_room(String name, String msg)
    {
        this.name = name;
        this.msg = msg;
    }

Chat_room 클래스에 데이터를 담고, onBindViewHolder에서 불러옵니다
Main Acivity에서 데이터를 adapter에 add 합니다.

 chat_room = new Chat_room(random_user, chat);

            items.add(chat_room);
            dbHandler.addChatData(chat_room);

            int position = adt.getItemCount() - 1;
            recyclerView.scrollToPosition(position);

            adt.notifyItemInserted(position);
어디가 문제인지 알려주시면 감사하겠습니다!
한번 봐주세요 ㅠㅠ!!!

1개의 답변

0 추천
뷰홀더 적용해보세요~~~~~~~~~
레디안 (560 포인트) 님이 2017년 12월 22일 답변
위에 코드 보시면 아시겠지만 ViewHolder 적용되어있고 이상하게도
Glide를 이용해서 이미지를 불러오는 것만 이런 현상이 발생하네요
Text는 문제없이 올라가요
제 생각에 카메라(카메라로 사진찍어서 recyclerView에 올려줍니다//)를 눌러서 사진찍는 화면으로 넘어가게되면 앱내에서 onPause가 실행되는데 여기에서 뭔가 문제가 생기는 것 같아요..;;
...