2013-10-11 3 views
2

Я читал много ответов по одному и тому же вопросу, но все же я не понимаю, почему мой код работает неправильно. У меня есть проблема с (как я думаю) обменом данными между двумя видами деятельности. У меня есть 2 действия - первый содержит ListView и кнопку Add.ни onActivityResult(), ни notifyDataSetChanged() work

Когда пользователь нажимает Добавить новое действие начинается с заполняемой формы. Когда пользователь заполняет форму, он нажимает «ОК», и мое первое действие начинается снова (это действительно так), и оно должно содержать новый элемент (но это не так).

Это моя первая деятельность:

public class DatabaseActivity extends Activity implements OnClickListener { 

    ArrayList<Student> students; 
    StudentDatabaseAdapter adapter; 
    ListView lvStudentList; 

    ImageButton imgBtnAdd; 


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

     students = new ArrayList<Student>(); 
     fillArrayList(); 

     adapter = new StudentDatabaseAdapter(this, students); 
     lvStudentList = (ListView)findViewById(R.id.lvStudentsList); 
     lvStudentList.setAdapter(adapter); 

     imgBtnAdd = (ImageButton)findViewById(R.id.imagBtnAddStudent); 

     imgBtnAdd.setOnClickListener(this); 

    } 


    public void fillArrayList() { 
     //code here  
    } 

    @Override 
    public void onClick(View v) { 
     Intent intent; 
     intent = new Intent(this, WizardActivity.class); 
     startActivity(intent); 
    } 

    public void addStudent(Student student) { 
     students.add(student); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 
     if(resultCode==RESULT_OK) 
     { 
      if(requestCode==2) 
      { 
       if (intent == null) {return;} 
       Student newStudent = new Student(intent.getStringExtra("name"), intent.getStringExtra("surname"), 
         intent.getStringExtra("last_name"), Integer.parseInt(intent.getStringExtra("year_of_birth")), R.drawable.default_ava); 
       addStudent(newStudent); 
       adapter.notifyDataSetChanged(); 
      } 
     } 
    } 
} 

И это моя вторая активность:

public class WizardActivity extends Activity implements OnClickListener { 

    EditText etName, etSurname, etLastName, etYearOfBirth; 

    ImageButton imgBtnOK; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.wizard);  

     etName = (EditText)findViewById(R.id.etName); 
     //initializing other edit texts 

     imgBtnOK = (ImageButton)findViewById(R.id.imgBtnOK); 

     imgBtnOK.setOnClickListener(this);   
    } 

    @Override 
    public void onClick(View v) { 
     Intent intent = new Intent(this, DatabaseActivity.class); 

     intent.putExtra("name", etName.getText().toString()); 
     intent.putExtra("surname", etSurname.getText().toString()); 
     intent.putExtra("last_name", etLastName.getText().toString()); 
     intent.putExtra("year_of_birth", etYearOfBirth.getText().toString()); 
     setResult(RESULT_OK, intent); 


     startActivityForResult(intent, 2); 
    } 
} 

ответ

2

Там нет ничего плохого с notifyDataSetChanged(). Кажется, вам не хватает того, как вторичная активность передает результаты обратно в свою активность вызывающего абонента.

  • DatabaseActivity.onClick() должен вызвать startActivityForResult() вместо startActivity().

  • WizardActivity.onClick() должен просто позвонить finish() после setResult() (удалить startActivityForResult() вызов, он не имеет смысла, там). Также обратите внимание, что цель вы предоставить setResult() может быть пустым намерением, т.е. Intent intent = new Intent();

  • После того, как вторичная активность заканчивается, DatabaseActivity будет обратно на передний план, и результат будет обработан DatabaseActivity.onActivityResult().

+0

Спасибо большое !!! это помогло! – Lanitka

0

Я думаю, вам не нужно начать новую деятельность в WizardActivity

попробовать это:

WizardActivity 


    ...... 
    @Override 
public void onClick(View v) { 
    Intent intent = new Intent(this, DatabaseActivity.class); 

     intent.putExtra("name", etName.getText().toString()); 
     intent.putExtra("surname", etSurname.getText().toString()); 
     intent.putExtra("last_name", etLastName.getText().toString()); 
     intent.putExtra("year_of_birth", etYearOfBirth.getText().toString()); 
     setResult(RESULT_OK, intent); 


    finish(); 

} 

и

DatabaseActivity 

add if you want 

@Override 
protected void onResume(){ 

...... 
adapter.notifyDataSetChanged(); 
} 
+0

Я выполнил первую часть вашего ответа и изменил свою базу данных, поскольку Piovezan sugested - теперь он работает отлично! Спасибо) – Lanitka

+0

ОК, это здорово, просто выберите вопрос как разрешенный –

+0

Не могли бы вы рассказать мне, где я могу пометить свой вопрос как разрешенный? – Lanitka

Смежные вопросы