2013-04-18 2 views
-2

나는 지난 몇 시간 동안 인터넷 검색을하고 있는데,이 질문은 20 번이나 물어 보았지만 해결 방법은 전혀 없다고 생각합니다. ListView 및 CustomList 클래스가 있는데, 목록 어댑터와 항목 편집/제거/이름 바꾸기를위한 간단한 대화 상자가 통합되어 있습니다. 모든 것은 첫 번째 화면 회전까지 예상대로 작동합니다. 그 후에 어댑터에 모든 올바른 데이터가 포함되어 있지만 목록은 업데이트되지 않습니다. 줄을 건너 뛰지 않고 두 파일을 모두 게시합니다. 이 시점에서 어떤 데이터도 저장 될 필요가 없습니다. 나중에 처리 할 것입니다. 아마 화면 회전 후 응용 프로그램이 완전히 다시 시작되기 때문에 이것은 정말 이상합니다. 무엇을 더 이상하게 만들면, 더미 항목은 화면 회전 후에도 추가되지만 그 이후에는 목록에서 다른 응답이 없습니다.Android ListView가 방향 변경 후 업데이트되지 않았습니다.

제 영어와 noobness를 용서하고 올바른 방향으로 나를 가리 키도록하십시오.

package com.sl.mylandmarks; 

import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.location.LocationManager; import android.os.Bundle; import android.provider.Settings; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; 

public class MainActivity extends Activity { 

    Button addButton; ListView landmarksList;  EditText inputName, inputSearch; CustomList customList; Context globalContext; TextView gpsState; private LocationManager locationManager; private GPSTracker gpsTracker; private double longitude; private double latitude; 

    @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main); 

     gpsTracker = new GPSTracker(MainActivity.this); 

     globalContext = this; 

     addButton = (Button) findViewById(R.id.addBtn); 

     customList = new CustomList(this); 

       landmarksList = (ListView) findViewById(R.id.listView1);  landmarksList.setAdapter(customList.getAdapter());  landmarksList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);  landmarksList.setTextFilterEnabled(true);  landmarksList.setLongClickable(true);  customList.theList = landmarksList; 


     inputName = (EditText) findViewById(R.id.EditItemName); 

     gpsState = (TextView) findViewById(R.id.gpsState); 

     ContentResolver contentResolver = getBaseContext().getContentResolver();  boolean gpsStatus = Settings.Secure.isLocationProviderEnabled(
       contentResolver, LocationManager.GPS_PROVIDER);   if (gpsStatus) {   gpsState.setText("GPS Enabled");  } else {   gpsState.setText("GPS Disabled");  } 

     // // SEARCH BOX 

     inputSearch = (EditText) findViewById(R.id.editText3);  inputSearch.addTextChangedListener(new TextWatcher() { 

      public void afterTextChanged(Editable s) { 

      } 

      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) {   } 

      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 
       customList.getAdapter().getFilter().filter(s);   }  });   // // SEARCH BOX 



     ///DUMMY ITEMS  customList.addItem("Home", "43.1565/15.8645");  customList.addItem("Work", "43.1565/15.8645");  customList.addItem("Denis` apartment", "43.1565/15.8645");  customList.addItem("Natasa", "43.1565/15.8645");  customList.addItem("Bruce Wayne", "43.1565/15.8645");   customList.addItem("Walker shop", "43.1565/15.8645");   customList.addItem("Chuck Norris Residence", "43.1565/15.8645");  customList.addItem("Some landmark", "43.1565/15.8645");  // customList.removeItem(3); 


     OnItemLongClickListener listLongClick = new OnItemLongClickListener() { 

      @Override   public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
        int arg2, long arg3) { 
       customList.showOptionsDialog(arg2); 
       return true;// event consumed, not dispatched forward   }  }; 

     landmarksList.setOnItemLongClickListener(listLongClick); 

     OnClickListener ButtonClick = new View.OnClickListener() { 

      @Override   public void onClick(View v) { 
       switch (v.getId()) { 
       case R.id.addBtn: 

        customList.addItem(inputName.getText().toString(), 
          "45.5644/23.6541"); 

        inputName.setText(""); 
        break; 

       } 

      } 

     }; 

     addButton.setOnClickListener(ButtonClick); 

    } 

    @Override public void onPause() {   super.onPause(); 


    } 

    @Override public void onResume() {  super.onResume(); 

    } 

    @Override public boolean onCreateOptionsMenu(Menu menu) {   // Inflate the menu; this adds items to the action bar if it is present.  getMenuInflater().inflate(R.menu.main, menu);  return true; 

    } 

} 

및 CustomList.java

package com.sl.mylandmarks; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import android.app.Dialog; 
import android.content.Context; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 

public class CustomList { 

    ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(
      2); 
    HashMap<String, String> maplist; 
    SimpleAdapter listAdapter; 
    public Context context; 
    public ListView theList; 
    public CustomList(Context con) { 

     context = con; 
     String[] from = { "line1", "line2" }; 

     int[] to = { android.R.id.text1, android.R.id.text2 }; 

     listAdapter = new SimpleAdapter(context, list, 
       android.R.layout.simple_list_item_2, from, to); 

    } 

    public void addItem(String name, String coords) { 
     if ((name != null) && (name.length() != 0)) { 
      maplist = new HashMap<String, String>(); 
      maplist.put("line1", name); 
      maplist.put("line2", coords); 
      list.add(maplist); 
      listAdapter.notifyDataSetChanged(); 
     } 
    } 

    public void removeItem(int id) { 



     Log.d("removing",list.remove(id).toString()); 

     listAdapter.notifyDataSetChanged(); 
    } 

    public void renameItem(int id, String newName) { 
     Log.d("SL","Rename Selected"); 
     maplist = new HashMap<String, String>(); 
     maplist.put("line1", newName); 
     maplist.put("line2", list.get(id).get("line2")); 
     list.set(id, maplist); 
     listAdapter.notifyDataSetChanged(); 

    } 

    public SimpleAdapter getAdapter() { 

     return listAdapter; 
    } 

    public void showOptionsDialog(final int position) { 

     //Log.d("SL", String.valueOf(position)); 
     final Dialog optionsDialog = new Dialog(context); 
     optionsDialog.setContentView(R.layout.list_dialog); 
     optionsDialog.setTitle("Options"); 
     optionsDialog.show(); 
     final EditText itemNameEdit = (EditText) optionsDialog 
       .findViewById(R.id.EditItemName); 
     final Button removeBtn = (Button) optionsDialog 
       .findViewById(R.id.removeBtn); 
     final Button renameBtn = (Button) optionsDialog 
       .findViewById(R.id.renameBtn); 
     final Button cancelBtn = (Button) optionsDialog 
       .findViewById(R.id.cancelBtn); 

     itemNameEdit.setText(list.get(position).get("line1")); 
     itemNameEdit.setSelection(itemNameEdit.length()); 

     OnClickListener ButtonClick = new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       switch (arg0.getId()) { 
       case R.id.removeBtn: 
        removeItem(position); 
        optionsDialog.dismiss(); 
        break; 
       case R.id.renameBtn: 
        renameItem(position, itemNameEdit.getText().toString()); 
        optionsDialog.dismiss(); 
        break; 
       case R.id.cancelBtn: 
        optionsDialog.dismiss(); 
        break; 
       } 
      } 

     }; 

     removeBtn.setOnClickListener(ButtonClick); 
     renameBtn.setOnClickListener(ButtonClick); 
     cancelBtn.setOnClickListener(ButtonClick); 

    } 

} 
+0

"화면 회전 후 응용 프로그램이 완전히 다시 시작되는 것 같습니다"라는 의미는 무엇입니까? 일반적으로 화면 회전시에는 시스템에서 activity의 onStop() 메소드를 호출 한 다음 onRestart()를 호출하고 onStart()를 호출합니다. Android 기기에 자원이 없으면 활동을 완전히 삭제하거나 완전히 파괴해서는 안됩니다. 가능한 경우 에뮬레이터에서이 작업을 시도하는 것이 좋습니다. – roky

+0

음, onCreate도 성공적으로 호출되었음을 알았습니다. 위에서 쓴 것을 제외하고는 모든 것이 정상적으로 작동합니다. 지금 바로 시도해 보겠습니다. – Nick

+0

에뮬레이터에서와 동일한 문제가 발생합니다. 이것은 정말로 이상하다, 나는 그렇지 않다면,이 버그가 나의 날을 먹었다. – Nick

답변

1

내가 정확히 질문이 무엇인지 확실하지. 그리고 저는 여러분의 코드를 보지 않았습니다. 왜냐하면 저는 SO가 클래스를 덤프하고 "이것을 수정하십시오"라고 말하는 것은 좋지 않다고 생각하기 때문입니다. 그러나 나는 너에게 답을 줄지도 모른다.

Android가 회전 할 때 (예 : roky가 말하는 것처럼) 활동을 재현한다는 것은 사실입니다. 당신이 아이폰 개발 배경에서 온다면 (제 경우) 이상하게 보입니다.

활동이 너무 복잡하지 않은 경우 Android에서 처리하도록 말할 수 있습니다. ,

<activity android:configChanges="orientation|screenSize" ... > 
</activity> 

여기 나보다 더 나은 설명 귀하의 AndroidManifest.xml의 태그에 이것을 추가 여기에 마 : 내 대답은 좋은 일이라면 android:configChanges="orientation" does not work with fragments

, 그것을 받아 들일 좋을 것이다!

+0

수업을 내 버려서 미안해, 나는 무엇이든 놓치고 싶지 않았다. 코드를 살펴보고 왜 첫 번째 순환 후 목록이 업데이트되지 않는지 알 수 있는지 확인하십시오. 회전을 처리하거나 데이터를 저장하려고하지 않습니다. 이 순간에 내가 원하는 것은 응용 프로그램이 다시 시작된 것처럼 작동하는 것입니다. – Nick

+0

문제 없습니다. 코드를 전혀 넣지 않는 것보다 여전히 좋습니다! 그러나 당신은 당신의 질문을 더 정확하게하려고 노력해야합니다. 하지만 코드를보기 전에 내 트릭을 시도 했습니까? – NLemay

+0

글쎄, 그 일을 내가 회전을 직접 처리해야한다는 것을 의미합니다. 나는 지금 당장이 일을하고있다. 앱을 다시 시작하는 동안 자체 회전으로 문제가되지 않습니다. 이해가 안되는 이유는 목록이 순환 게재 후 더 이상 업데이트되지 않는 이유입니다. – Nick

관련 문제