2015-10-29 5 views
1

Я использую внешнюю карточную библиотеку (gabrielemariotti cardlib) в своем приложении. Особенно я использую CardRecyclerView расширяет RecyclerView и CardArrayRecyclerViewAdapter расширяет BaseRecyclerViewAdapter. У меня есть два вида деятельности Основная деятельность (с CardRecyclerView) и деятельность ProductCardКак сохранить в onSaveInstanceState

Моя цель состоит в том, чтобы сохранить все карты в Основной деятельности, когда я вернулся из другой деятельности (ProductCard) или когда я включил ориентацию MainActivity. К сожалению, я не понимаю, как сохранить мой «mRecyclerView» в onSaveInstanceState. Может ли кто-нибудь помочь?

package com.example.dmitry.myfoodbasket; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Toast; 

import java.io.Serializable; 
import java.util.ArrayList; 

import it.gmariotti.cardslib.library.cards.actions.BaseSupplementalAction; 
import it.gmariotti.cardslib.library.cards.actions.IconSupplementalAction; 
import it.gmariotti.cardslib.library.cards.material.MaterialLargeImageCard; 
import it.gmariotti.cardslib.library.internal.Card; 
import it.gmariotti.cardslib.library.internal.CardHeader; 
import it.gmariotti.cardslib.library.recyclerview.internal.CardArrayRecyclerViewAdapter; 
import it.gmariotti.cardslib.library.recyclerview.view.CardRecyclerView; 

public class MainActivity extends AppCompatActivity { 
    final String LOG_TAG = "myLogs"; 
    ArrayList<BaseSupplementalAction> actions; 
    ArrayList<Card> cards; 
    MaterialLargeImageCard card; 
    CardArrayRecyclerViewAdapter mCardArrayAdapter; 
    CardRecyclerView mRecyclerView; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d(LOG_TAG, "onCreate"); 


     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       /*Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show();*/ 
       cards.add(card); 
       mCardArrayAdapter.notifyDataSetChanged(); 
      } 
     }); 



     cards = new ArrayList<Card>(); 
     card = 
       MaterialLargeImageCard.with(this) 
         .setTextOverImage("Italian Beaches") 
         .useDrawableId(R.drawable.im_beach) 
         .setupSupplementalActions(R.layout.carddemo_native_material_supplemental_actions_large_icon,actions) 
         .build(); 
     cards.add(card); 
     card.setOnClickListener(new Card.OnCardClickListener() { 
      @Override 
      public void onClick(Card card, View view) { 
       Intent intent=new Intent(MainActivity.this,ProductCard.class); 
       startActivity(intent); 




      }}); 

     actions = new ArrayList<BaseSupplementalAction>(); 

     IconSupplementalAction t1 = new IconSupplementalAction(this, R.id.ic1); 
     t1.setOnActionClickListener(new BaseSupplementalAction.OnActionClickListener() { 
      @Override 
      public void onClick(Card card, View view) { 
       Toast.makeText(MainActivity.this, " Click on Text SHARE ", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     actions.add(t1); 

     IconSupplementalAction t2 = new IconSupplementalAction(this, R.id.ic2); 
     t2.setOnActionClickListener(new BaseSupplementalAction.OnActionClickListener() { 
      @Override 
      public void onClick(Card card, View view) { 
       Toast.makeText(MainActivity.this," Click on Text LEARN ", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     actions.add(t2); 

     IconSupplementalAction t3 = new IconSupplementalAction(this, R.id.ic3); 
     t3.setOnActionClickListener(new BaseSupplementalAction.OnActionClickListener() { 
      @Override 
      public void onClick(Card card, View view) { 
       Toast.makeText(MainActivity.this, " Карточка удалена ", Toast.LENGTH_SHORT).show(); 
       cards.remove(card); 
       mCardArrayAdapter.notifyDataSetChanged(); 
      } 
     }); 
     actions.add(t3); 


     mCardArrayAdapter = new CardArrayRecyclerViewAdapter(this, cards); 
     mRecyclerView = (CardRecyclerView) this.findViewById(R.id.carddemo_recyclerview); 
     mRecyclerView.setHasFixedSize(false); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     if (mRecyclerView != null) { 
      mRecyclerView.setAdapter(mCardArrayAdapter); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 


} 
+1

Вы не можете сохранить вид, все, что вы можете сделать, это сохранить данные, которые вы имеете в этом представлении. –

+0

@SharpEdge OK. Что вы мне посоветуете в этом случае? Каков наилучший вариант для моей проблемы? –

+0

проверить мой ответ –

ответ

1

Ваша деятельность будет уничтожена и воссоздана каждый раз, когда пользователь поворачивает экран. Когда экран меняет ориентацию, система уничтожает и воссоздает активность переднего плана.

Чтобы сохранить дополнительные данные о состоянии активности, вы должны переопределить onSaveInstanceState() метод обратного вызова

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
// Save the user's current game state 
savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 
// Always call the superclass so it can save the view hierarchy state 
super.onSaveInstanceState(savedInstanceState); } 

Теперь вы можете сохранить определенные Строки, Интс или события пользовательского Parelable объектов в выше Bundle экземпляра. А когда активность воссоздает просто проверить, если Bundle onSavedInstance в OnCreate() является нулевым или не

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); // Always call the superclass first 

// Check whether we're recreating a previously destroyed instance 
if (savedInstanceState != null) { 
// Restore value of members from saved state and populare your RecyclerView again 
mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 
} else { 
// Probably initialize members with default values for a new instance 
} 

Вы можете заменить выше данных, которые вы хотите сохранить, а затем повторно заполнить ваши мнения как RecyclerView и т.д. с данные, сохраненные в паре «значение-значение» в файле savedInstance.

Просто имейте в виду, что Bundle не предназначен для хранения большого объема данных.

Извините, если некоторые идентификаторы кода не очень понятны, гораздо труднее отправить ответ с мобильного.

Для более четко объяснить ссылку на это official guide

+0

Спасибо за ваш ответ. Но вы сказали использовать переменные, такие как mCurrentScore или mCurrentLevel. И какой они? Как я думаю, это может быть строка или int или что-то вроде этого. Но я хочу сохранить все карты в моем recyclerview. Правильно ли, что мне нужно сохранить карты ArrayList в качестве переменных? Действительно ли сохранить ArrayList как переменную? –

+0

Что такое карта? Это какой-то пользовательский класс? Если это так, вы можете сохранить это в Bundle, если ваш класс карты правильно реализует Parcelable Interface. –

+0

Да, абсолютно. Карта является обычным классом –

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