나는 지난 몇 시간 동안 인터넷 검색을하고 있는데,이 질문은 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);
}
}
"화면 회전 후 응용 프로그램이 완전히 다시 시작되는 것 같습니다"라는 의미는 무엇입니까? 일반적으로 화면 회전시에는 시스템에서 activity의 onStop() 메소드를 호출 한 다음 onRestart()를 호출하고 onStart()를 호출합니다. Android 기기에 자원이 없으면 활동을 완전히 삭제하거나 완전히 파괴해서는 안됩니다. 가능한 경우 에뮬레이터에서이 작업을 시도하는 것이 좋습니다. – roky
음, onCreate도 성공적으로 호출되었음을 알았습니다. 위에서 쓴 것을 제외하고는 모든 것이 정상적으로 작동합니다. 지금 바로 시도해 보겠습니다. – Nick
에뮬레이터에서와 동일한 문제가 발생합니다. 이것은 정말로 이상하다, 나는 그렇지 않다면,이 버그가 나의 날을 먹었다. – Nick