【问题标题】:put list of objects in `Intent`将对象列表放入`Intent`
【发布时间】:2020-04-21 17:30:47
【问题描述】:

我在 ViewModel 中有一个 liveData,它返回一个对象列表 (mChannelList: MutableLiveData<List<Channels>> = MutableLiveData())。我想使用Intent 的putExtra 将此列表发送到另一个活动。我在下面编写代码,但是当代码通过 startActivity 时,不要转到新活动 (MainActivity)。

我正确地将对象列表放入Intent?

SplashScreenActivity.kt

(...)

            splashScreenViewModel.getList()?.observe(this, Observer { it : List<Channels> ->
                println("*********************** ${it}")
                val intent = Intent(this, MainActivity::class.java)
                intent.putExtra("EXTRA_PEOPLE", ArrayList(it))
                startActivity(intent)
            })

数据类:

data class Channels (
    var Id: Int?,
    var Title: String?,
    var CallLetter: String?,
    var ChannelPosition: Int?
)

MainActivity.kt

(...)

val bundle = intent.extras
val arr = this.intent.getParcelableArrayListExtra<Parcelable>("EXTRA_PEOPLE")

println("a lista : ${arr[0]}")

【问题讨论】:

  • 我认为你不需要那么复杂。当您使用 ViewModel 时,您可以简单地在 MainActivity 中访问它。请记住在实例化 ViewModel 时使用应用程序的上下文。请参阅documentation 了解更多信息。
  • 你是说当你的观察者触发时你的 MainActivity 没有启动?或者您没有在 MainActivity 中获取任何数据?
  • 是的,我的 MainActivity 没有启动 @JuanMartinez

标签: android kotlin android-intent


【解决方案1】:

不建议在活动之间传递对象列表。正如@IlyaMaier 所说,更稳健的方法是使用应用程序上下文初始化 ViewModel,然后在 MainActivity 中重用相同的 LiveData。

如果你想以同样的方式继续,你的 MainActivity 没有被调用有两个原因。

  1. 观察者无法在您的 ViewModel 类中接收新数据。
  2. 数据类应扩展 Pacelable 并添加注释 @Parcelize。

像这样:

@Parcelize
data class Channels (
var Id: Int?,
var Title: String?,
var CallLetter: String?,
var ChannelPosition: Int? 
) : Parcelable

【讨论】:

    【解决方案2】:

    1.为列表的 Object 类实现 Serializable

    public class ObjClassName implements Serializable {   
    //your object class body    
    }
    

    2。使用意图发送列表时

    List<ObjClassName> objList=new ArrayList<>();    
    Intent intent=new Intent(CurrentScreen.this,NextScreen.class);        
            intent.putExtra("IDENTICAL_NAME",(Serializable)objList);    
            startActivity(intent);
    

    3.检索列表时

    List<ObjClassName> objList=new ArrayList<>();       
            Intent intent = getIntent();    
            objList = (List<ObjClassName>)intent.getSerializableExtra("IDENTICAL_NAME"); 
    

    这对我有用! 谢谢

    【讨论】:

      猜你喜欢
      • 2010-12-05
      • 1970-01-01
      • 2015-12-16
      • 2014-10-15
      • 2016-07-21
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多