2013-10-04 1 views
0

목록이 새로 고쳐질 때 마지막 위치로 돌아가는 것에 대해 묻는 질문이 많이 있다는 것을 알고 있습니다. 그러나 나는 왜 내 경우에는 (어댑터) 주어진 답변이 작동하지 않습니다 모르겠어요. 주어진 시간에 새로운 정보로 새로 고치고 어댑터에로드하는 어댑터가 있습니다. 내가 원했던 것은 새로 고침을 할 때 어댑터 상단으로 다시 오지 않고 이전 상태를 저장한다는 것입니다. 다음은 내가 사용하는 코드입니다.Android : 새로 고침 할 때 어댑터의 마지막 위치로 돌아 가기

에서 OnCreate

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.all_candidatos); 
     if (Titulacion.IsReachable1(getApplicationContext())){ 

       new CargarCandidatos().execute(); 
     timer(); 


      }else{ 
       Toast.makeText(getApplicationContext(), R.string.errorserver, Toast.LENGTH_LONG).show(); 
      } 


     setListAdapter(adapter); 

     candidatosList = new ArrayList<HashMap<String, String>>(); 

AsyncTask를 2 개 부분으로 분할된다. 정보를 검색하고 어댑터에 데이터를 적용합니다. 여기 적응의 코드는 다음과 같습니다

protected void onPostExecute(String file_url) { 
    runOnUiThread(new Runnable() { 
     public void run() { 

      adapter = new SimpleAdapter(
        Monitorizacion.this, candidatosList, 
        R.layout.list_item, new String[] { TAG_ID,TAG_NSERIE,TAG_TABLET, 
          TAG_DNI, TAG_NOMBRE, TAG_TEST, TAG_PREGUNTA, TAG_BATERIA,TAG_CORRECTAS, TAG_ERRORES}, 
        new int[] { R.id.autoid,R.id.id,R.id.tablet, R.id.dni, R.id.nombre, R.id.test, R.id.pregunta, R.id.bateria, R.id.correctas, R.id.fallos}); 
      adapter.notifyDataSetChanged(); 
      setListAdapter(adapter); 



     } 
    }); 

} 

하지만 어댑터의 상태를 저장하는 방법 다음 이전 상태를 고려하여 항목을 보여주는 시작합니다. 내가 Maintain/Save/Restore scroll position when returning to a ListView 여기 approbed 대답을 시도했다, 그러나 나는 그것이 작동 할 수 없습니다 :

당신에게

편집을 감사드립니다.

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.all_candidatos); 
     if (Titulacion.IsReachable1(getApplicationContext())){ 

       new CargarCandidatos().execute(); 
     timer(); 


      }else{ 
       Toast.makeText(getApplicationContext(), R.string.errorserver, Toast.LENGTH_LONG).show(); 
      } 


     setListAdapter(adapter); 

     candidatosList = new ArrayList<HashMap<String, String>>(); 

    lv = (ListView)findViewById(android.R.id.list); 


     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       String idd = ((TextView) view.findViewById(R.id.dni)).getText() 
         .toString(); 

       Intent in = new Intent(getApplicationContext(), 
         MonitDetail.class); 
       in.putExtra("idd", idd); 

       startActivityForResult(in, 100); 
      } 
     }); 

    } 



// 
// 
    public void timer(){ 
     new CountDownTimer(tiempo, 1000) { 

       public void onTick(long millisUntilFinished) { 

       } 

       public void onFinish() { 
        index = lv.getFirstVisiblePosition(); 
        v = lv.getChildAt(0); 
        top = (v == null) ? 0 : v.getTop(); 
         if (Titulacion.IsReachable1(getApplicationContext())){ 

          new CargarCandidatos().execute(); 
        timer(); 


         }else{ 
          Toast.makeText(getApplicationContext(), R.string.errorserver, Toast.LENGTH_LONG).show(); 
         } 
      } 
     }.start();} 




    class CargarCandidatos extends AsyncTask<String, Void, String> { 





     protected String doInBackground(String... args) { 




       try { 
        monitorizar(); 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace();} 
       return null; 




     } 


     protected void onPostExecute(String file_url) { 
      runOnUiThread(new Runnable() { 
       public void run() { 

        adapter = new SimpleAdapter(
          Monitorizacion.this, candidatosList, 
          R.layout.list_item, new String[] { TAG_ID,TAG_NSERIE,TAG_TABLET, 
            TAG_DNI, TAG_NOMBRE, TAG_TEST, TAG_PREGUNTA, TAG_BATERIA,TAG_CORRECTAS, TAG_ERRORES}, 
          new int[] { R.id.autoid,R.id.id,R.id.tablet, R.id.dni, R.id.nombre, R.id.test, R.id.pregunta, R.id.bateria, R.id.correctas, R.id.fallos}); 
        lv.setSelectionFromTop(index, top); 

        adapter.notifyDataSetChanged(); 

        lv.setAdapter(adapter); 





       } 
      }); 

     } 

    } 
    public void monitorizar() throws Exception{ 
     try { 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 
      params.add(new BasicNameValuePair("fecha",Titulacion.fecha())); 

      JSONObject json = jParser.makeHttpRequest(url_candidatos, "GET", params); 
      ArrayList<HashMap<String, String>> temp; 
      temp = new ArrayList<HashMap<String, String>>(); 


      int success = json.getInt(TAG_SUCCESS); 

      if (success == 1) { 

       candidatos = json.getJSONArray(TAG_CANDIDATOS); 

       for (int i = 0; i < candidatos.length(); i++) { 
        JSONObject c = candidatos.getJSONObject(i); 
        String id = c.getString(TAG_ID); 
        String nserie = c.getString(TAG_NSERIE); 
        String tablet = c.getString(TAG_TABLET); 
        String dni = c.getString(TAG_DNI); 
        String nombre = c.getString(TAG_NOMBRE); 
        String test = c.getString(TAG_TEST); 
        String pregunta = c.getString(TAG_PREGUNTA); 
        String bateria = c.getString(TAG_BATERIA); 
        String correctas = c.getString(TAG_CORRECTAS); 
        String errores = c.getString(TAG_ERRORES); 

        HashMap<String, String> map = new HashMap<String, String>(); 
        map.put(TAG_ID, id); 
        map.put(TAG_NSERIE, nserie); 
        map.put(TAG_TABLET, tablet); 
        map.put(TAG_DNI, dni); 
        map.put(TAG_NOMBRE, nombre); 
        map.put(TAG_TEST, test); 
        map.put(TAG_PREGUNTA, pregunta); 
        map.put(TAG_BATERIA, bateria); 
        map.put(TAG_CORRECTAS, correctas); 
        map.put(TAG_ERRORES, errores); 
        temp.add(map); 
        candidatosList = temp; 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 



    } 
} 

답변

0

당신은 당신의 ListView의

getListView().setSelection(position); 

방법처럼 사용할 수 있습니다.

여기서 어댑터로 전달할 목록의 길이에서 '위치'를 얻을 수 있습니다.

+0

하지만 어떻게 그 위치를 검색하나요? Listview는 선언하지 않았습니다. – Katherine99

+0

업데이트 답변 확인 –

+0

죄송합니다. 아직 작동하지 않습니다. 내 질문 업데이트 됨 ** – Katherine99

0

전역 적으로 listview를 선언하고 New-Data-call 전에 마지막 위치를 유지할 수 있습니다. 그 다음에는 listview를 호출하여 위치 선택을 할 수 있습니다.

+0

타이머가 선택 완료되면 이것을 사용합니다. lv.getSelectedItemPosition(); 나는 lv.setSelection (selection)을 사용한다. adapter.notifyDataSetChanged(); lv.setAdapter (adapter); 데이터를 새로 고친 후 Listview가 첫 번째 위치로 돌아갑니다. – Katherine99

관련 문제