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

리스트뷰 getChildAt와 setSelection문제

0 추천

 

터치가 아닌 버튼으로 listview를 움직이려고 합니다.

검색해본 결과 setSelection으로 스크롤 움직이고 getChildAt().BackgroundColor을 이용하여 색을 바꾸는데

getChildAt().BackgroundColor가 이상하게 동작합니다. 위에서 차례로 하나씩 내려오면서 선택되게 하고 싶은데 스크롤 아래에 있는것 까지 선택되고 어쩔때는 한개씩 뛰어넘는 현상이 일어납니다. 

 

  1. package com.example.phonebook;
    
    import java.util.ArrayList;
    
    import android.app.Activity;
    
    public class MainActivity extends Activity {
    
        private ListView lv;
        ArrayAdapter<String> adapter;
    
        int scroll_pos = 0;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
            // Listview Data
            String products[] = {"안기차녕", "무한도전기", "정형기돈", "정차형", "선물",
                    "아델", "집",
                    "기차", "버스", "기차1", "아리", "유재슥", "유재속", "유석재", "유느님", "하하","호호","히히","명수","무도","모두"};
    
            lv = (ListView) findViewById(R.id.list_view);
    
            // Adding items to listview
            adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, products);
            lv.setAdapter(adapter);
    
            findViewById(R.id.up).setOnClickListener(mClickListener);
            findViewById(R.id.down).setOnClickListener(mClickListener);
        }
    
        Button.OnClickListener mClickListener = new View.OnClickListener() {
            public void onClick(View v) {
    
                switch (v.getId()) {
                    case R.id.up:
                        scroll_pos--;
                        if (scroll_pos < 0) scroll_pos = 0;
                        break;
    
                    case R.id.down:
                        scroll_pos++;
                        break;
                }
    
                lv.setSelection(scroll_pos);
                lv.getChildAt(scroll_pos).setBackgroundColor(Color.BLUE);
            }
        };
    
    }

 

커스컴 리스트뷰로  어답터에 getView에도 해봤는데도 잘 안되었습니다.

눈온다다다 (730 포인트) 님이 2016년 3월 16일 질문

2개의 답변

0 추천
 
채택된 답변
배경색을 변경하려면 데이터를 변경한 후 notifyDataSetChanged를 호출하세요.
익명사용자 님이 2016년 3월 16일 답변
눈온다다다님이 2016년 3월 16일 채택됨
감사합니다!!!! 근데 adapter.notifyDataSetChanged()위에 lv.setSelection(pos);를 두니까 동작을 안하네요. 그래서 아래에다가 두었어요. 그래서 코드가 아주살~짝 복잡해지네요
0 추천
RecyclerView를 이용해보세요.

색상의 변경처리는 Adapter에서 처리하고

업데이트 하고 싶은 아이템만 notifyItemChanged메서드를 활용하면

리스트 전부를 갱신하지 않고 해당 아이템만 갱신하게 됩니다.
클린코드 (300 포인트) 님이 2016년 3월 16일 답변
...