본문 바로가기

프로그램개발

[Android] ListView 새로고침/갱신하기 (with BaseAdapter)

보통 아래와 같이 Adapter에 추가(또는 삭제) 하고 notifyDataSetChanged()를 호출하면 ListView 가 새로고침 된다고 한다.

하지만 아무런 변화가 없다. 

1
2
listAdapter.addItem(ds);
listAdapter.notifyDataSetChanged();
cs

 

 

그래서 구글링해보니..

ListView 최초 생성때와 같이 setAdapter 를 하라고 한다. 잘 동작한다.

1
2
listAdapter = new MainListAdapter(getActivity(), ArrayList<DataSet> mStrData);
mainListView.setAdapter(listAdapter);
cs

 

하지만 서버로 부터 실시간으로 많은 데이터를 받아와서 ListView 에 추가하였더니 화면이 버벅거리는 현상이 발생하였다. 구형 폰에서는 거의 화면이 뚝뚝 끊겨 보이기까지 한다. 

 

아래와 같이 수정후 자연스럽게 동작하는 것을 확인하였다.

주석 부분과 같이 데이터 크기 넣어주고 notifyDataSetChanged()를 호출하면 버벅임 없이 잘 동작한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
listAdapter.updateReceiptsList(mStrData); // 새로운 데이터 배열을 넣자
 
public class MainListAdapter extends BaseAdapter {
    private ArrayList<DataSet> m_oData = null;
    private int nListCnt = 0;
    
    ...........................
    
    public void addItem(DataSet ds){
        m_oData.add(0, ds);
        nListCnt = m_oData.size(); // 배열 사이즈 다시 확인
        this.notifyDataSetChanged(); // 호출후에 하던지 아니면. 그냥 여기서 하자
    }
 
    public void updateReceiptsList(ArrayList<DataSet> _oData) {
        m_oData = _oData;
        nListCnt = m_oData.size(); // 배열 사이즈 다시 확인
        this.notifyDataSetChanged(); // 그냥 여기서 하자
    }
    
    @Override
    public int getCount(){
        return nListCnt; // 또는 m_oData.size();
    }
    ...........................
}
cs

 

간단히 수정할수 있는 부분인데 쓸데없이 시간만 소비하고 ㅋㅋ. 역시 기초가 튼튼해야함.

댓글