-1

在过去的几个小时里,我一直在谷歌上搜索,我已经看到这个问题被问了 20 次,但似乎没有一个解决方案对我有用。我有一个 ListView 和一个 CustomList 类,它包含一个列表适配器和一个用于编辑/删除/重命名项目的简单对话框。在第一次屏幕旋转之前,一切都按预期工作。之后,列表停止更新,尽管适配器包含所有正确的数据。我将在不跳过一行的情况下发布这两个文件。我现在不需要保存任何数据,稍后我会处理。这真的很奇怪,因为据说应用程序会在屏幕旋转后完全重新启动。更奇怪的是,即使在屏幕旋转之后,虚拟项目也会添加到 onCreate,但之后列表中没有其他响应。

请原谅我的英语和我的菜鸟,并尝试为我指明正确的方向。

  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);

    }

}
4

1 回答 1

0

我不确定你的问题到底是什么。而且我没有查看您的代码,因为我认为 SO 不是转储类并说“修复此问题”的好地方。但我可能会给你一个答案。

确实,当您旋转时,Android 正在重新创建活动(如 roky 所说)。如果您来自 iPhone 开发背景(我就是这种情况),那看起来有点奇怪。

但是如果你的activity不是太复杂,你可以告诉Android来处理它。为此,将其添加到您的 AndroidManifest.xml 标记中

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

这是比我更好的解释:android:configChanges="orientation" 不适用于片段

如果我的回答是好的,那就太好了!

于 2013-04-18T21:09:59.697 回答