Android: почему функция listview.add всегда добавляет элементы на позицию 1 в списке - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь реализовать два действия, которые обмениваются информацией между ними, используя намерения. Упражнение № 1 содержит пустой список и кнопку, которая запускает занятие № 2 при нажатии. На занятии № 2 у меня есть несколько полей для ввода текста и кнопка «Сохранить», которая отправляет через методы intent.putExtra информацию в занятие № 1. Проблема заключается в том, что каждый раз, когда я пытаюсь создать новый View с информацией, переданной Activity # 2, список переопределяет первый элемент.

Вы можете увидеть ниже метод OnCreate из Activity # 1:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_explorer);
    notesList = findViewById(R.id.listviewNotes);

        FloatingActionButton myFab = this.findViewById(R.id.fabAddNote);
        myFab.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent intentNoteEditor = new Intent(getApplicationContext(), NoteEditor.class);
            startActivity(intentNoteEditor);
            //Log.i("Lista",notesList.getCount()+"");
        }
    });
        Intent intent =getIntent();
        Bundle extras =intent.getExtras();
        if(extras!=null){
            if(extras.containsKey("isnewNote")){
                isnewElement=extras.getBoolean("isnewNote",false);
            }
        }
    if(isnewElement==true){

        //***************Fetch data from intent***************//
            notetext = intent.getStringExtra("noteText");
            notecolor = intent.getStringExtra("noteColor");
            notelocation = intent.getStringExtra("noteLocation");
            notereminder = intent.getStringExtra("noteReminder");
            Note receivednote = new Note(notetext, notecolor, notereminder, notelocation);
            MyAdapter adapter = new MyAdapter(this, R.layout.list_item, notesArray);
            notesArray.add(receivednote);
            notesList.setAdapter(adapter);
        //***************End Fetch data from intent***********//
    }
}

Я также присоединяю реализованный пользовательский адаптер.

publi c Класс MyAdapter расширяет ArrayAdapter {

private Context mContext;
private int mResource;
private ArrayList<Note> mNotes = new ArrayList<>();
private String TAG = "Adapter Class";

public MyAdapter(@NonNull Context context, int resource, ArrayList<Note> objects) {
    super(context, resource, objects);
    mContext = context;
    mResource = resource;
    mNotes = objects;
}

@Override
public int getCount() {
    return mNotes.size();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View listItem =convertView;
    if(listItem==null){
        listItem=LayoutInflater.from(mContext).inflate(mResource,parent,false);

    Note currentNote = mNotes.get(position);
    String text = mNotes.get(position).getText();
    String color = mNotes.get(position).getColor();
    String location = mNotes.get(position).getLocation();
    String reminder = mNotes.get(position).getReminder();

    TextView nttxt = listItem.findViewById(R.id.noteText);
    TextView ntcolor = listItem.findViewById(R.id.textcolor);
    TextView ntrem = listItem.findViewById(R.id.reminder);
    TextView ntlocat = listItem.findViewById(R.id.location);

    nttxt.setText(text);
    ntcolor.setText(color);
    ntrem.setText(reminder);
    ntlocat.setText(location);
    }
    return listItem;
}

}

Я зарегистрировал размер списка и он всегда равен 1. По какой-то причине он не сохраняет текущие элементы после запуска действия № 2.

Любой совет будет оценен.

1 Ответ

1 голос
/ 24 апреля 2020

Проблема в том, что каждый раз, когда вы нажимаете кнопку «Сохранить» в Занятии №2, вы запускаете новый экземпляр Занятия № 1 и, следовательно, одну заметку в списке. Вам нужно использовать метод startActivityForResult () при запуске Activity2, а затем переопределить onActivityResult (), чтобы получить данные, возвращаемые данными. Упражнение № 1 может выглядеть следующим образом:

 public static final int NEW_NOTE_REQUEST = 23;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_explorer);
    notesList = findViewById(R.id.listviewNotes);

    FloatingActionButton myFab = this.findViewById(R.id.fabAddNote);
    myFab.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent intentNoteEditor = new Intent(getApplicationContext(), NoteEditor.class);
            startActivityForResult(intentNoteEditor, NEW_NOTE_REQUEST);
            //Log.i("Lista",notesList.getCount()+"");
        }
    });

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // Check the returned result and parse the data
    if(resultCode == RESULT_OK && requestCode == NEW_NOTE_REQUEST){
        notetext = intent.getStringExtra("noteText");
        notecolor = intent.getStringExtra("noteColor");
        notelocation = intent.getStringExtra("noteLocation");
        notereminder = intent.getStringExtra("noteReminder");
        Note receivednote = new Note(notetext, notecolor, notereminder, notelocation);
        MyAdapter adapter = new MyAdapter(this, R.layout.list_item, notesArray);
        notesArray.add(receivednote);
        notesList.setAdapter(adapter);

    }
}

А затем в занятии № 2:

public void onSaveButtonClick(View view) {
    Intent intent = new Intent();
    // Add note data to intent

    // return the result to Activity#1
    setResult(RESULT_OK, intent);
    finish();
}

Эту же функцию можно выполнить, создав общий репозиторий данных, например, синглтон. класс, который будет содержать ваш список заметок, и оба действия будут иметь ссылку на один и тот же список заметок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...