导航回上一个活动后更新列表视图

问题描述 投票:2回答:1

请原谅我的noobness。我只是不明白如何实现它来使用我的代码。我正在做的是编辑列表视图中的名称。在“EditDeleteList”中编辑名称并返回上一个活动(ListView)以查看列表视图中更新的名称时,没有任何反应。我必须彻底退出活动才能看到变化的反映。我该如何更新?我实现了一个onActivityReult()方法,但后来得到这个错误消息“java.lang.NullPointerException:尝试在空对象引用上调用接口方法'int java.util.List.size()'”所以我完全删除了它。如何在不收到错误消息的情况下更新列表视图?

ListView.Java

    public class ListView extends AppCompatActivity {
    private static final String TAG = "ListView";
    DatabaseHelper mDatabaseHelper;
    Button btnAdd;
    private EditText editText;
    private android.widget.ListView listView;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);
        mDatabaseHelper = new DatabaseHelper(this);
        btnAdd = (Button) findViewById(R.id.btnAdd);
        editText = (EditText) findViewById(R.id.editText);
        listView = (android.widget.ListView) findViewById(R.id.lv);

        ArrayList<String> list = getIntent().getStringArrayListExtra("myList");

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

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

        lv.setAdapter(adapter);


        //Takes user back to the main activity
        ImageView ivBack = (ImageView) findViewById(R.id.ivBackArrow);
        ivBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: pressed back arrow");
                Intent intent = new Intent(ListView.this, MainActivity.class);
                startActivity(intent);
            }
        });

        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String newEntry = editText.getText().toString();

                if (editText.length() != 0) {
                    addData(newEntry);
                    editText.setText("");
                } else {
                    toastMessage("you must put something in the text field");
                }
            }
        });

        populateListView();
    }

    public void addData(String newEntry) {
        boolean insertData = mDatabaseHelper.addData(newEntry);

        if (insertData) {
            toastMessage("Successfully inserted");
            recreate();
        } else {
            toastMessage("Whoops, something went wrong");
        }
    }

    private void toastMessage(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }

    private void populateListView() {
        Log.d(TAG, "populateListView: displaying data in the listview");

        //get data and append to list
        Cursor data = mDatabaseHelper.getData();
        ArrayList<String> listData = new ArrayList<>();
        while(data.moveToNext()) {
            //get the value from the database in column 1
            //set it to the arraylist
            listData.add(data.getString(1));
        }
        //create arraylist and set it to the adapter
        ListAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listData);
        listView.setAdapter(adapter);

        //set onclick listen to edit activity
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                String name = adapterView.getItemAtPosition(position).toString();
                Log.d(TAG, "onItemClick: you clicked on " + name);

                Cursor data = mDatabaseHelper.getItemID(name); //get the id associated with that name
                int itemID = -1;
                while (data.moveToNext()) {
                    itemID = data.getInt(0);
                }
                if (itemID > -1) {
                    Log.d(TAG, "onItemID: the ID is: " + itemID);
                    Intent editScreenIntent = new Intent(ListView.this, EditDeleteList.class);
                    editScreenIntent.putExtra("id",itemID);
                    editScreenIntent.putExtra("name",name);
                    startActivity(editScreenIntent);
                } else {
                    toastMessage("No ID found");
                }
            }
        });
    }
}

edit delete list.Java

    public class EditDeleteList extends AppCompatActivity {

    private static final String TAG = "EditDeleteList";

    DatabaseHelper mDatabaseHelper;
    private ImageView ivDelete;
    private ImageView ivApprove;
    private EditText editHashtag;
    private String selectedName;
    private int selectedID;

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

        mDatabaseHelper = new DatabaseHelper(this);
        editHashtag = (EditText) findViewById(R.id.editHashtag);
        ivDelete = (ImageView) findViewById(R.id.ivDelete);
        ivApprove = (ImageView) findViewById(R.id.ivApprove);

        //get the intent extra from the ListView activity
        final Intent receivedIntent = getIntent();

        //get item ID passed as an extra
        selectedID = receivedIntent.getIntExtra("id", -1);

        //get name passed as an extra
        selectedName = receivedIntent.getStringExtra("name");

        //set text field to selected item text
        editHashtag.setText(selectedName);

        ivApprove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String item = editHashtag.getText().toString();
                if (!item.equals(null)) {
                    mDatabaseHelper.updateName(item, selectedID, selectedName);
                } else {
                    toastMessage("you must enter a #hashtag");
                }
                finish();
            }
        });

    }

    private void toastMessage(String message) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
}

在EditDeleteList.java中,我有一个onClickListener,它保存更改并使用finish()返回到上一个活动;

ivApprove.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String item = editHashtag.getText().toString();
            if (!item.equals(null)) {
                mDatabaseHelper.updateName(item, selectedID, selectedName);
            } else {
                toastMessage("you must enter a #hashtag");
            }
            finish();
        }
    });
java listview adapter
1个回答
2
投票

在活动生命周期的某些部分通知适配器。

当你回去时,OnCreate()不应该运行(这是你必须完全重新创建活动以查看更新列表的原因)所以你应该使用OnRestart/OnStart/OnResume来通知适配器检查新项目。

检查这个image

© www.soinside.com 2019 - 2024. All rights reserved.