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

listview 갱신 문제입니다.

0 추천

지금 현재 스레드에서 데이터를 가져와서 list뷰에 추가를 해줍니다(일정한 시간마다)

그런데 다시 자료를 넣을때마다 스크롤이 맨위로 가더군요;;

스크롤이 맨위로 안가고 보고있는 위치에 있게 만들고싶습니다.

protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
		myAsyncTask = new DataSetSync();
		myAsyncTask.execute();
		
		timer = new CountDownTimer(4 * 1000, 1000) {  
            public void onTick(long millisUntilFinished) {  
            	Log.d("db","time go");
            }  
     
            public void onFinish() {
            	Adapter_Data.notifyDataSetChanged();
            	myAsyncTask.cancel(true);
            	myAsyncTask = new DataSetSync();
            	myAsyncTask.execute();
            	Log.d("db","time out");
            	timer.start();
            }  
        };
		timer.start();
	}

	

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		timer.cancel();
	}



	public class DataSetSync extends AsyncTask<Void, String, Void> {
		 protected Void doInBackground(Void... unused){
	            Log.d("Thread","Thread call");
	    		// db 가져와서 셋
	            
	            try {
					DbSet db = new DbSet();
					arrayData = db.EqpMeterRead_Logger_InfoResult();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	            
	            Adapter_Data = new Adapters(Tab1_Logger.this, android.R.layout.simple_list_item_1, arrayData);
	            return(null);
	     }

		@Override
		protected void onPostExecute(Void result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			listView.setAdapter(Adapter_Data);
		}
	}

 

프릴레온 (140 포인트) 님이 2013년 8월 29일 질문

1개의 답변

0 추천
adapter 를 계속 set 하고 있으니 그런 것 입니다.
aucd29 (218,390 포인트) 님이 2013년 8월 29일 답변
adapter 계속 set하는 방법 말고 adapter를 갱신하는 방법은 없나요?
adapter 는 1번만 설정 하고 손댈 필요가 없습니다. 실제 데이터인 arraylist 만 추가 한 뒤 Adapter_Data.notifyDataSetChanged(); 만 호출하면 갱신된 내용이 적용 됩니다.

즉 지금 코드에서 set 을 1번만 하도록 수정하면 됩니다.
protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        Log.d("db", "onCreate");
        setContentView(R.layout.tab1_logger);
       
        Adapter_Data = new Adapters(Tab1_Logger.this, android.R.layout.simple_list_item_1, arrayData);
       
        listView = (ListView)findViewById(R.id.tab1_listView);
       
        myAsyncTask = new DataSetSync();
        myAsyncTask.execute();
    }

public class DataSetSync extends AsyncTask<Void, String, Void> {
         protected Void doInBackground(Void... unused){
                Log.d("Thread","Thread call");
                // db 가져와서 셋
                try {
                    DbSet db = new DbSet();
                    arrayData = db.EqpMeterRead_Logger_InfoResult();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return(null);
         }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            Log.d("db", "onPostExecute");
            Adapter_Data.notifyDataSetInvalidated();
            listView.setAdapter(Adapter_Data);
        }
    }

이런 형태로 바꾸었는데 데이터가 갱신이 되지않습니다;; 하얀화면 그대로네요 ㅠ
지금 구조는 arrayData 를 아답터에 정의 하곤
Adapter_Data = new Adapters(Tab1_Logger.this, android.R.layout.simple_list_item_1, arrayData);

등록되어진 arrayData 를 지워버린 꼴이 됩니다.
arrayData = db.EqpMeterRead_Logger_InfoResult();

다음과 같이 코드가 변경되어야 합니다.
현 코드상으로는 이렇고 개인적으로는 db를 가져오는 부분이 변경되어야 할 것 같습니다.

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    Log.d("db", "onCreate");
    setContentView(R.layout.tab1_logger);
    
    Adapter_Data = new Adapters(Tab1_Logger.this, android.R.layout.simple_list_item_1, arrayData);
    listView = (ListView)findViewById(R.id.tab1_listView);
    listView.setAdapter(Adapter_Data);

    myAsyncTask = new DataSetSync();
    myAsyncTask.execute();
}

public class DataSetSync extends AsyncTask<Void, String, Void> {
     protected Void doInBackground(Void... unused){
            Log.d("Thread","Thread call");
            // db 가져와서 셋
            try {
                DbSet db = new DbSet();
                ArrayList<?????> arrayData2 = db.EqpMeterRead_Logger_InfoResult();

                arrayData.clear();
                arrayData.addAll(arrayData2);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return(null);
     }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        Log.d("db", "onPostExecute");
        Adapter_Data.notifyDataSetInvalidated();
    }
}
감사합니다 덕분에 해결됬어요 ㅠ
...