android checkbox scroll시 깜빡깜빡 하는 문제


리스트에 표시되는 체크박스에 체크를 하고 밑으로 스크롤을 하면 특정 체크박스에 일순간 체크가 들어갔다가 해제되는 현상이 발생합니다. (애니메이션)

스크롤 할때마다 데이터 설정한다음 데이터노티피로 갱신하고 있습니다. 체크값 자체는 별문제 가 없는데 스크롤할때마다 체크되어있는 부분과 위의 현상이 발생하여 깜빡깜빡 하는 현상발생합니다.

6.0.1넥서스로 실행하였습니다. 같은 현상 해결이나 링크가 있으면 조언 부탁드립니다. 나름 열심히 알아보고 있는데 잘 안나오네요.

  • 2016년 05월 16일에 작성됨
    Android개발을 하고 있습니다만 모르는것이 많습니다. ^^;;

조회수 426


3 답변


좋아요
0
싫어요
채택취소하기

넥서스 6P(6.0.1)에서 간단한 테스트를 해봤는데요. 언급해주신 문제를 발견하지는 못했습니다. 테스트 코드 및 결과 영상 첨부했고요. 현재 작업 중인 코드에서 정상적으로 동작하는 최소 샘플을 만드신 후 문제가 발생하는 코드와 비교하면서 문제를 찾아가는게 좋을 것 같습니다.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler);
        recyclerView.setAdapter(new Adapter(createModels()));
    }

    private List<Model> createModels() {
        List<Model> models = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            models.add(new Model("Title " + i, new Random().nextBoolean()));
        }
        return models;
    }

    static class Adapter extends RecyclerView.Adapter<ViewHolder> {

        List<Model> models;

        Adapter(List<Model> models) {
            this.models = models;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item, null));
        }

        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            holder.bind(models.get(position));
        }

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

    static class ViewHolder extends RecyclerView.ViewHolder {

        TextView textView;
        CheckBox checkBox;

        ViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.title);
            checkBox = (CheckBox) itemView.findViewById(R.id.checkbox);
        }

        void bind(Model model) {
            textView.setText(model.title);
            checkBox.setChecked(model.checked);
        }

    }

    static class Model {

        String title;
        boolean checked;

        Model(String title, boolean checked) {
            this.title = title;
            this.checked = checked;
        }
    }
}

결과영상

https://dl.dropboxusercontent.com/u/539401/sample.mp4


  • 영상까지 너무나 감사드립니다.^^ 비교해보니 코드는 거의 비슷하고 영상을보니 체크박스가 다르더라구요 아마도 제가 적용하고 있는게 material design checkbox 라서 그런거 아닐까 생각이 됩니다.     초보초보초밥입니다.   2016.5.18 12:50     
  • 아직 해결은 안되었는데 나중에라도 해결되면 공유 할께용    초보초보초밥입니다.   2016.5.24 11:54     

ListView를 사용하고 계신가요? 만약 ListView를 사용 중이라면 뷰 리사이클링으로 인한 현상으로 보입니다. ViewHolder 패턴 사용 시 getView() 함수 내에서 ViewHolder에 데이터를 매번 설정해야 합니다. 그렇지 않을 경우, 스크롤 시 뷰가 재사용되면서 실제 데이터와 뷰가 일치하지 않을 수 있습니다.

만일 ListView가 아닌 다른 뷰를 사용 중이어서 제가 헛다리를 짚은거라면 관련 코드를 올려주시면 현상 파악에 도움이 될 것 같습니다.



답변 감사합니다. 리사이클뷰를 이용하고 있고 뷰홀더에 매번 데이터를 설정해 주기때문에 데이터 자체에는 문제가 없습니다. 제가 설명을 잘못해서 죄송합니다.

  1. List item checked
  2. List item
  3. List item

스크롤을 내리면

  1. List item
  2. List item
  3. List item

위처럼 리스트가 있다고 가정합니다. 화면에 보이는 리스트는 위의1~3번까지라고 생각해주시고 스크롤을 내리면 밑의1~3번이 보이게 되는데요.. 여기서 밑의1번에 순간적으로 체크가 들어갔다가 없어지는 현상이 발생합니다. 아마도 버전에 따른 애니메이션이 추가 되지 않았나 생각이 듭니다. 전에는 없었는데

설명이 제대로 되었나 모르겠네요..
코드는 지극히 간단합니다. 데이터 바인딩으로 그냥 set 해주는게 다라서 ....


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close