2015-11-04 11 views
0

Я пытаюсь сохранить мой arraylist «лиц» в onSaveInstanceState, а затем восстановить его в create(), когда я перемещаю ориентацию. Через бревна я вижу, что люди восстановлены, но адаптер не показывает мне на экране предметы от людей! К сожалению, я не понимаю, как это исправить. Может ли кто-нибудь помочь?Адаптер не показывает элементы

import android.content.Intent; 
import android.os.Bundle; 
import android.os.PersistableBundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.CardView; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
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 java.util.List; 

public class MainActivity extends AppCompatActivity { 
    private List<Person> persons; 
    private RecyclerView rv; 
    final String LOG_TAG = "myLogs"; 
    RVAdapter adapter; 
    Person person; 
    ProductCardList mProductCard; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     rv = (RecyclerView)findViewById(R.id.rv); 
     rv.setHasFixedSize(true); 
     LinearLayoutManager llm = new LinearLayoutManager(this); 
     rv.setLayoutManager(llm); 
     persons = new ArrayList<>(); 
     adapter = new RVAdapter(persons); 
     rv.setAdapter(adapter); 



     if ((savedInstanceState != null) && (savedInstanceState.getSerializable("card") != null)) { 
       persons = (List<Person>) savedInstanceState.getSerializable("card"); 
       adapter.notifyDataSetChanged(); 
       Log.d(LOG_TAG, "restore card with persons" + persons); 
       } 



     adapter.setOnItemClickListener(new RVAdapter.MyClickListener() { 
      @Override 
      public void onItemClick(int position, View v) { 
       Toast.makeText(MainActivity.this, "push on item" + position, Toast.LENGTH_SHORT).show(); 
       Intent intent = new Intent(MainActivity.this, ProductCard.class); 
       startActivity(intent); 
      } 
     }); 


     setSupportActionBar(toolbar); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       person= new Person("Emma Wilson", "23 years old", R.drawable.im_beach); 
       persons.add(person); 
       Log.d(LOG_TAG, "push add" + persons); 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

    } 


     @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 void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putSerializable("card", (Serializable) persons); 
     Log.d(LOG_TAG, "save cards" + persons); 
    } 

    @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); 
    } 
} 

Мой адаптер

import android.support.v7.widget.CardView; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by Dmitry on 01.11.2015. 
*/ 
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder>{ 
    List<Person> persons; 
    private static String LOG_TAG = "MyRecyclerViewAdapter"; 
    private static MyClickListener myClickListener; 
    RVAdapter(List<Person> persons){ 
     this.persons = persons; 
    } 
    @Override 
    public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card, viewGroup, false); 
     PersonViewHolder pvh = new PersonViewHolder(v); 
     return pvh; 
    } 

    @Override 
    public void onBindViewHolder(PersonViewHolder personViewHolder, int i) { 
     personViewHolder.personName.setText(persons.get(i).name); 
     personViewHolder.personAge.setText(persons.get(i).age); 
     personViewHolder.personPhoto.setImageResource(persons.get(i).photoId); 
    } 

    @Override 
    public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
     super.onAttachedToRecyclerView(recyclerView); 
    } 

    @Override 
    public int getItemCount() { 
     return persons.size(); 
    } 

    public static class PersonViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     CardView cv; 
     TextView personName; 
     TextView personAge; 
     ImageView personPhoto; 
     PersonViewHolder(View itemView) { 
      super(itemView); 
      cv = (CardView)itemView.findViewById(R.id.cv); 
      personName = (TextView)itemView.findViewById(R.id.person_name); 
      personAge = (TextView)itemView.findViewById(R.id.person_age); 
      personPhoto = (ImageView)itemView.findViewById(R.id.person_photo); 
      itemView.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      myClickListener.onItemClick(getAdapterPosition(), v); 
     } 
    } 

    public void setOnItemClickListener(MyClickListener myClickListener) { 
     this.myClickListener = myClickListener; 
    } 
    public interface MyClickListener { 
     public void onItemClick(int position, View v); 
    } 

} 

Обновление раздела

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     rv = (RecyclerView)findViewById(R.id.rv); 
     rv.setHasFixedSize(true); 
     LinearLayoutManager llm = new LinearLayoutManager(this); 
     rv.setLayoutManager(llm); 
     persons = new ArrayList<>(); 
     adapter = new RVAdapter(persons); 
     rv.setAdapter(adapter); 



     if ((savedInstanceState != null) && (savedInstanceState.getSerializable("card") != null)) { 
       persons = (List<Person>) savedInstanceState.getSerializable("card"); 
       adapter = new RVAdapter(persons); 
       rv.setAdapter(adapter); 
       adapter.notifyDataSetChanged(); 
       Log.d(LOG_TAG, "restore card with persons" + persons); 
       } 

ответ

3

Вы не проходя десериализованное список лиц, к адаптеру. Вы заменяете экземпляр person и не обновляете список.

Просто двигайтесь:

adapter = new RVAdapter(persons); 
rv.setAdapter(adapter); 

после прочтения savedInstanceState.

Или что-то вроде этого:

persons = new ArrayList<>(); 
adapter = new RVAdapter(persons); 
rv.setAdapter(adapter); 

if (savedInstanceState != null && savedInstanceState.getSerializable("card") != null) { 
    persons.clear();   
    persons.addAll((List<Person>) savedInstanceState.getSerializable("card")); 
    adapter.notifyDataSetChanged(); 
    Log.d(LOG_TAG, "restore card with persons" + persons); 
} 
+0

если переместить эти две строки после прочтения savenInstanceState я получаю ошибку com.example.dmitry.myapplication_fragment E/AndroidRuntime: вызвано следующими причинами: java.lang.NullPointerException: Попытка вызвать виртуальный метод 'void com.example.dmitry.myapplication_fragment.RVAdapter.notifyDataSetChanged()' в ссылке нулевого объекта –

+0

Исправляю это (см. Раздел «Обновление» в вопросе). Но я смущен, что теперь у меня есть две копии этих двух строк. Я думаю, что это неправильно –

+0

И можете ли вы подробно описать, как привить мой код, если я хочу использовать addAll? –

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