Обновить представление списка после перехода к предыдущему действию - PullRequest
2 голосов
/ 06 марта 2019

Извините, мой нубизм.Я просто не понимаю, как реализовать это для работы с моим кодом.То, что я делаю, это редактирование имени, которое находится в виде списка.При редактировании имени в «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");
                }
            }
        });
    }
}

EditDeleteList.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();
        }
    });

1 Ответ

2 голосов
/ 06 марта 2019

Уведомить адаптер в какой-то части жизненного цикла действия.

OnCreate() не должен запускаться при возврате (по этой причине вам необходимо полностью воссоздать действие, чтобы увидеть обновленный список), чтобы выследует использовать OnRestart/OnStart/OnResume, чтобы уведомить адаптер о необходимости проверки новых элементов.

Проверьте это image

...