2015-01-06 8 views
1

Возможно ли однажды реализовать Parcelable-класс и использовать его для всех других классов, чтобы передавать списки с дополнительным добавлением список массивов между действиями?Как избавиться от реализации Parcelable для каждого класса в android, чтобы использовать его для добавления лишнего списка массивов

ответ

0

Да, с отражением.

import android.os.Parcel; 
import android.os.Parcelable; 
import android.util.Log; 

import java.lang.reflect.Field; 
import java.util.ArrayList; 

public class ParcelableEntity implements Parcelable { 
    private static final String TAG = "ParcelableEntity"; 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel destination, int flags) { 

     destination.writeString(this.getClass().getCanonicalName()); 

     for (Field field : this.getClass().getDeclaredFields()) { 
      try { 
       field.setAccessible(true); 
       if (field.getType().equals(java.util.List.class)) { 
        destination.writeList((ArrayList) field.get(this)); 
       } else 
        destination.writeValue(field.get(this)); 
      } catch (Exception err) { 
       Log.w(TAG, err.toString()); 
      } 

     } 

    } 

    public static final Creator CREATOR = new Creator() { 
     public ParcelableEntity createFromParcel(Parcel source) { 
      try { 
       Object entity = Class.forName((source.readString())).newInstance(); 

       for (Field field : entity.getClass().getDeclaredFields()) { 
        try { 
         field.setAccessible(true); 
         if (field.getType().equals(java.util.List.class)) { 
          ArrayList list = new ArrayList(); 
          source.readList(list, Class.forName(field.getDeclaringClass().getName()).getClassLoader()); 
          field.set(entity, list); 
         } else 
          field.set(entity, source.readValue(field.getType().getClassLoader())); 

        } catch (Exception err) { 
         Log.w(TAG, err.toString()); 
        } 
       } 

       return (ParcelableEntity) entity; 

      } catch (Exception err) { 
       return null; 
      } 
     } 

     public ParcelableEntity[] newArray(int size) { 
      return new ParcelableEntity[size]; 
     } 
    }; 

} 

И теперь вы должны продлить его в своем классе

public class Book extends ParcelableEntity { 

    public Long id; 
    public String name; 
} 

И затем использовать его

public void onClick(View view) { 
     ArrayList<book> lstBook = new ArrayList<>(); 
     Book b1 = new Book(); 
     b1.id = 1L; 
     b1.name = "test 1"; 
     lstBook.add(b1); 
     Book b2 = new Book(); 
     b2.id = 2L; 
     b2.name = "test 2";  
     lstBook.add(b2); 

     Intent intent = new Intent(MainActivity.this, SecondActivity.class); 
     intent.putParcelableArrayListExtra("TEST", lstBook); 
     startActivity(intent); 
    } 
2

Вместо-использования отражения не лучше Сериализация в JSON строку (с использованием Библиотека GSON) и де-сериализуется в Object в классе назначения.

+0

Это быстрее, чем GSON serialize.I проверю его. Вы тоже можете. – farhad2161

2

Не боритесь с системой. Использование Reflection или JSON влияет на производительность. Идем дальше с помощью Parcelable и используем вспомогательный сайт, например, http://www.parcelabler.com/ или плагин для Android Studio, например https://github.com/mcharmas/android-parcelable-intellij-plugin

+0

Для менее чем 10 000 записей, думаю, отражение достаточно хорошее. – farhad2161