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

커스텀 listview notifyDataSetChanged질문..

0 추천

안녕하세요 초보안드로이드 개발자입니다.

우선 소스부터 보시죠..

public class DiaryActivity extends SherlockActivity implements OnScrollListener{

 private static int AddDiary = 1;
 private ListView Lv_diary;
 private int listcount = 3;
 private DiaryListViewAdapter adapter;
 private JSONArray test = new JSONArray();
 
 private Handler handler = new Handler(){
  @Override
  public void handleMessage(Message msg) {
   // TODO Auto-generated method stub
   super.handleMessage(msg);
   
   if(msg.obj.toString().equals("boardnull")){
    Toast.makeText(DiaryActivity.this, "등록된 다이어리가 없습니다.", Toast.LENGTH_SHORT).show();
   }else if(msg.obj.toString().equals("boardfail")){
    Toast.makeText(DiaryActivity.this, "데이터베이스 접근실패.", Toast.LENGTH_SHORT).show();
   }else{
    //성공시
    try {
     JSONArray jsonarr;
     jsonarr = new JSONArray(msg.obj.toString());
     test = jsonarr;
     setDiaryListView(jsonarr);
    } catch (JSONException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
 };
 
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     // TODO Auto-generated method stub
     ActionBar actionbar = getSupportActionBar();
  actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
     setContentView(R.layout.activity_diary);
     
//     SharedPreferences pref = getSharedPreferences("MungNyange_userinfo", MODE_PRIVATE);
//  String membership_idx = pref.getString("membership_idx", "");
  
  try{
   JSONObject ob = new JSONObject();
//   ob.put("membership_idx", membership_idx);
   ob.put("type", "Diary");
   new DButil("http://www.wizcompany.com/gbid/app/dataset/boardprocess.php", handler, ob,"loadboard").start();
  }catch (JSONException e) {
   // TODO: handle exception
   Log.d("ErrorLog", "PatProfileActivity : onStart : " + e.toString());
  }
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // TODO Auto-generated method stub
  super.onCreateOptionsMenu(menu);
  menu.add(0, AddDiary, 0, "adddiary").setIcon(R.drawable.ic_launcher).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
  return true;
 }
 
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // TODO Auto-generated method stub
  
  if(AddDiary == item.getItemId()){
   Intent intent = new Intent(this, DiaryAddActivity.class);
   startActivity(intent);
  }
  return true;
 }
 
 // Listview 셋팅
 private void setDiaryListView(JSONArray jsonarr) {
  // TODO Auto-generated method stub
  Lv_diary = (ListView)findViewById(R.id.Lv_diary);
  adapter =  new DiaryListViewAdapter(this, jsonarr, listcount);
  Lv_diary.setAdapter(adapter);
  Lv_diary.setOnScrollListener(this);
 }
 @Override
 public void onScroll(AbsListView view, int firstVisibleItem,
   int visibleItemCount, int totalItemCount) {
  // TODO Auto-generated method stub
  int count = totalItemCount - visibleItemCount;
  if(firstVisibleItem >= count && totalItemCount != 0){
   Log.d("--", "in!!!!!!!!!!!!!!!!!!");
   listcount = listcount +3;
   
   adapter = new DiaryListViewAdapter(this, test, listcount);
   adapter.notifyDataSetChanged();
   //Lv_diary.setAdapter(adapter);
  }
 }
 @Override
 public void onScrollStateChanged(AbsListView view, int scrollState) {
  // TODO Auto-generated method stub
  
 }
}

activity구요

 

 

지금 구현하려는것은 리스트 갱신인데요

handler에서 서버에서 전송받은 데이터를 한번에 몽땅 가져옵니다.

그리구 나서 listview.setadapter 한번해주구요 여기서 3개만 뿌려주게 처음엔 셋팅햇습니다.

그리구 나서 스크롤 이벤트를걸어서 onscroll 에서 위와같이 구현햇는데요..

adapter.notifyDataSetChanged 해주고 Lv_diary.setadapter(adapter)해주면

되긴 하지만 완전히 갱신하는거라 스크롤위치가 제일 상위로 올라가버리네요..

검색결과 adapter.notifyDataSetChanged 해주고 setadapter를 안해줘도 갱신이 되고

스크롤과 무관하게 아이템리스트만 추가된다고 하던데..

저는 저렇게 작성햇는데.. 아이템이 추가 되지 않네요;;

고수님들의 아낌없는 조언 부탁드립니다 ㅠㅠ

 

mamongs (4,050 포인트) 님이 2013년 6월 7일 질문

1개의 답변

0 추천

adapter에 단순히 데이터값만 변경한후 notifyDataSetChanged()를 호출해야지만

현재 스크롤 위치를 유지하면서 갱신됩니다.

올리신 소스를 보니 갱신할때도 아예 adapter를 new 연산자로 새로 생성하고 나서 notify 하시는데

그렇게 하시면 무조건 스크롤을 맨 위로 갈 수 밖에 없게 됩니다.

Gradler (109,780 포인트) 님이 2013년 6월 7일 답변
...