2014-10-01 3 views
0

XMLPullParser를 사용하여 XML 피드를 구문 분석 한 다음 들어오는 데이터를 목록에 저장하고 있습니다. 문제는 , 나는, AsyncTask에서 ArrayAdapter를 효율적으로 업데이트하는 방법은 무엇입니까?

내가

내가 XML에서 가져온 데이터를 저장하기 위해 ArrayList를 생성한다 뭐하는 거지에서 데이터를 하나의리스트를 뽑아 여러 피드를

protected ArrayList<String> feed_XMLs = new ArrayList<String>(); 

I 복수 급지하고 있으므로, 각 I 및 CREA URL로부터 데이터를 당겨

public static String XML_URL[] = { "http://Feed1", 
      "http://Feed2", 
      "http://Feed3", 
      }; 

그리고 그때 내부 PullParser AsyncTask를 사용하는 배열에서 그들을 저장 테 그 목적,

for (int x = 0; x < XML_URL.length; x++){ 
    GetXMLTitles xmlFirst = new GetXMLTitles(x); 
    xmlFirst.execute(); 
} 

내가 반복 될 때마다 다른 URL을 선택 AsyncTask를 클래스 내부의 생성자를 생성 - 각 반복에> new GetXMLTitles(x)

, URL을 선택하고 제목은 당기하고 ArrayList에 저장된다 feed_XMLs.

AsyncTask를 이후의 내부 onPostExecute 방법이 데이터는 이제 ArrayAdapter와

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, feed_XMLs); 

     setListAdapter(adapter); 

그게 모두 통과한다.

최종 출력물은 백 개의 제목이있는 거대한 ArrayList feed_XMLs입니다.

각 반복마다 새 URL이 선택되고 feed_XMLs ArrayList가 업데이트되어 화면에 표시됩니다. 첫번째 반복에서 예

,

먼저 URL이 선택되고, 모든 타이틀 feed_XMLs 변경, feed_XMLs에 저장된다. 이 제목은 화면에 표시됩니다.

두 번째 반복에서 두 번째 URL이 선택되고 모든 제목이 feed_XMLs ...에 추가되며 프로세스는 모든 반복에 대해 연속적입니다.

문제는,

모든 반복에 화면 상단의 스크롤 막대 이동

, 예를 들어

, 내가 아래로 모든 방법을 스크롤하여 ArrayAdapter와이 업데이트되면

, 화면에서 자동으로 위로 움직이며, 원하는 것은 아닙니다.

ArrayAdapter에서 새 데이터가 업데이트 될 때 화면이 그대로 유지됩니다.

어떻게하면됩니까? 심지어 가능할까요?

나는 시도했다, scrollview.fullScroll(View.FOCUS_DOWN);하지만 그 중 하나를 작동하지 않습니다.

어쨌든 ArrayAdapter를 스크롤하는 데 아무런 영향을주지 않는 방식으로 업데이트 하시겠습니까 ??

답변

2

나는 문제가 당신이 그냥 한 번 어댑터를 생성하고 데이터의 업데이트 각 onPostExecute

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, feed_XMLs); 

    setListAdapter(adapter); 

에서 새 어댑터를 만드는 것이라고 생각합니다. 이 같은

뭔가 :

if(adapter!=null) { 
    adapter.notifyDataSetChanged(); 
} 

편집 :

이 솔루션은 작동합니다 감사합니다!

나는 onPostExecute에서

ArrayAdapter<String> adapter; 

다음과 같은 기본 클래스에서 adapter, 어댑터가 onPostExecute 내부에 생성되기 때문에

if (adapter == null) { 
     adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, feed_XMLs); 
     setListAdapter(adapter); 
     } 

     else { 
      adapter.notifyDataSetChanged(); 
     } 
+0

, 그것은 자동으로 모든 반복에 생성하지 않을을 만들어? feed_XML 데이터가 업데이트되지 않았으므로 주 활동 클래스 내에 ArrayAdapter를 작성할 수 없습니다. 비동기 onPostExecute 내에 ArrayAdapter를 작성해야하지만 한 번만 작성하는 방법이 있습니까? P.S : 해결 방법이 작동하지 않습니다. –

+0

이 솔루션은 어댑터 인스턴스를 하나만 유지하면 작동합니다. 메인 액티비티에서 어댑터에 대한 참조를 유지하고, 어댑터를 한 번만 작성한 다음 (onPostExecute) 어댑터를 업데이트하십시오. – sotcha

관련 문제