2015-05-28 4 views
8

У меня есть моя основная деятельность с фрагментом, в котором Recyclerview retreaving все данные, заполненные из базы данных. В этом фрагменте я получил кнопку, которая вызывает другое действие для вставки объекта в базу данных.Обновить Recyclerview from another Activity

Проблема заключается в том, когда действие завершается и возвращается к основной деятельности, Recyclerview не показывает новый элемент, который я только что создал. Я попробовал этот кусок кода:

@Override 
    public void onResume() { 
      super.onResume(); 
      adapterItem.addItem(MyApplication.getWritableDatabase().getAllItems()); 
      listProjectsView.scrollToPosition(0); 
     } 

Функция getAllItems извлечь все данные из SQLite.

На моем adapterItem из моего Recyclerview я получил это:

public void addItem(ArrayList<Item> listItems) { 
     this.listItems = listItems; 
     notifyItemInserted(0); 
    } 

Он работает "отлично". Основная проблема заключается в том, когда я переключаюсь на другое приложение, находящееся на моем мобильном устройстве, и я возвращаюсь к моему разработанному приложению. onResume метод включается и снова показывает мою последнюю вставку, заполняя дважды этот элемент (и так далее, если я это сделаю снова) ,

Благодаря

+0

использование onRestart InstEd из onResume –

+0

использования должны 'HashSet' которые исключат дубликат элемента –

ответ

10

Пропустите новый деталь назад к MainActivity, то справиться с ней самостоятельно.

1.In MainActivity, используйте startActivityForResult, чтобы начать вторую активность, например:

startActivityForResult(new Intent(this, SecondActivity.class), REQUEST_CODE); 

REQUEST_CODE является int.

2.In второй активности, переопределения finish так:

@Override 
public void finish() { 
    Intent returnIntent = new Intent(); 
    returnIntent.putExtra("passed_item", itemYouJustCreated); 
    // setResult(RESULT_OK); 
    setResult(RESULT_OK, returnIntent); //By not passing the intent in the result, the calling activity will get null data. 
    super.finish(); 
} 

3.In MainActivity, переопределить onActivityResult так:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { 
     YourItem passedItem = data.getExtras().get("passed_item"); 
     // deal with the item yourself 

    } 
} 
+0

событие события recyclerview находится в адаптере RecyclerView, а не в MainActivity, поэтому как я могу это получить? –

+0

Спасибо, что приняли мой редактор Wesley и благодарю вас за ответ, вы очень помогли проекту, над которым я работаю :) –

+0

@LucasP. Пожалуйста – Wesley

0

Попробуйте Как это,

Intent intent = new Intent(Context, YourClass); 
startActivityForResult(intent, ADD_ITEM); 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == Activity.RESULT_OK) { 
     if (requestCode == ADD_ITEM){ 
      adapterItem.addItem(MyApplication.getWritableDatabase().getAllItems()); 
      listProjectsView.scrollToPosition(0); 
     } 
    }  
} 

надеюсь, что он будет работать для вас

+0

я попробовал один раз, но я не был способный отобразить анимацию добавления для recyclerview - я думаю, она добавляет ее до того, как активность станет полностью видимой. Знаете ли вы, как я могу добавить элемент из другого действия и добавить ли анимированное дополнение к recyclerview, когда я вернусь к своей mainactivity? – Simon

1

ответ Уэсли велик, но есть один недостаток. Данные, возвращаемые из второго действия, равны null, и поскольку мое изменение было отклонено, вот как передать данные обратно в вашу активность вызывающего абонента. Есть все, что Уэсли сказал, но при создании returnIntent добавить его в setResult так:

@Override 
public void finish() { 
    Intent returnIntent = new Intent(); 
    returnIntent.putExtra("passed_item", itemYouJustCreated); 
    // setResult(RESULT_OK); 
    setResult(RESULT_OK, returnIntent); //By not passing the intent in the result, the calling activity will get null data. 
    super.finish(); 
} 
Смежные вопросы