【问题标题】:Intent all data when ListView is clicked单击 ListView 时意图所有数据
【发布时间】:2022-01-23 07:45:53
【问题描述】:

我有这个使用 Kotlin 的 Android 应用程序,它填充 ListView 以显示电影标题。我目前面临的问题是我不确定如何 Intent 与 ListView 标题相关的所有数据。 一个例子是这样的,如果我点击“Jumanji”标题,应用程序会启动新活动并显示与点击的电影标题相关的所有信息

到目前为止,我只能填充 ListView 和 Intent,只有点击的电影的标题,但不知道如何做其余的

我填充电影列表的活动:

class SimpleViewListOfMoviesActivity : AppCompatActivity() {

    val INTENT_CODE = 1;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_view_list_of_movies)

        val movies = simpleMovieitemArray
        val movie_tiles = movies.map {it.title}
        // val movie_overviews = movies.map {it.overview} (testing ignore)

        val listAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, movie_tiles)
        movielist.adapter = listAdapter

        movielist.onItemClickListener = object : AdapterView.OnItemClickListener {
            override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long)
            {
//              displayToast("You have selected " + parent?.adapter?.getItem(position))
                MovieIntent(parent?.adapter?.getItem(position) as String)
            }

        }
    }


    fun displayToast(message:String){

        Toast.makeText(this,message, Toast.LENGTH_LONG).show()
    }

    fun MovieIntent(message:String)
    {
        var myIntent = Intent(this, SimpleItemDetailActivity::class.java)
        myIntent.putExtra("movieTitle", message)
        startActivityForResult(myIntent,INTENT_CODE)
    }

}

我通过 Intent 获取数据并显示的活动

class SimpleItemDetailActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.simple_activity_item_detail)

        var movieTitleFromList = intent.getStringExtra("movieTitle")
        movie_title.text = "$movieTitleFromList"
    }

数据从何而来”

class SimpleMovieSampleData {



    companion object{

        var simpleMovieitemArray : ArrayList<SimpleMovieItem>
        init {

            simpleMovieitemArray = ArrayList<SimpleMovieItem>()
            populateSimpleMovieItem()
        }



        fun populateSimpleMovieItem() : ArrayList<SimpleMovieItem>{
simpleMovieitemArray.add(
                SimpleMovieItem("Elsa, Anna, Kristoff and Olaf head far into the forest to learn the truth about an ancient mystery of their kingdom.",
                    "November 22, 2019",
                    "English",
                    "Frozen II (2019)")
            )

            simpleMovieitemArray.add(
                SimpleMovieItem("In Jumanji: The Next Level, the gang is back but the game has changed. As they return to rescue one of their own, the players will have to brave parts unknown from arid deserts to snowy mountains, to escape the world's most dangerous game.",
                    "December 13, 2019",
                    "English",
                    "Jumanji: The Next Level")
            )
//two examples of the movies
            return simpleMovieitemArray
        }

    }
}

【问题讨论】:

  • 你应该给你的电影一个id,并通过intent传递id。然后在SimpleItemDetailActivity 中根据id 过滤您的电影列表

标签: android android-studio kotlin listview


【解决方案1】:

您可以将 SimpleMovieItem 对象设为 Parcelable,并且当您单击一个项目时,您可以创建一个 Intent 将您的 SimpleMovieItem 对象放入您意图的额外捆绑包中:

intent.putExtra("key", Bundle().apply {
            putParcelable("object", simpleMovieItemObject)
        })

在你的新 Activity 中,你可以得到这个对象并做你想做的一切。

【讨论】:

  • 但是 SimpleMovieItem 就像一个实体,它只是声明每个值将是什么
  • Parcelable 是 Android 接口,可让您跨进程读取/写入数据。您可以让您的实体使用此指南实现 Parcelable 接口:developer.android.com/kotlin/parcelize
【解决方案2】:

我这样做了,它有效,但效率不高,我不知道如何缩短它:

override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long)
        {
            var overview = movies[0].overview.toString()
            var release_date = movies[0].release_date.toString()
            var language = movies[0].original_langauge.toString()
            var title = parent?.adapter?.getItem(position)


            if (title == movies[1].title)
            {
                overview = movies[1].overview.toString()
                release_date = movies[1].release_date.toString()
                language = movies[1].original_langauge.toString()
                //continue all the way till the end
            }

【讨论】:

  • 这正是我需要的,但是如果有人知道如何缩短它,请帮忙
【解决方案3】:

保存:

Gson gson = new Gson();
intent.putExtra("key",gson.toJson( movielist.get(position)));

阅读:

SimpleMovieItem movies;
String movieData=(getIntent().getStringExtra("key")));

     Type userType = new TypeToken<SimpleMovieItem>() {
            }.getType();
            movies= gson.fromJson(movieData, userType);

                overview = movies.overview.toString()
                release_date = movies.release_date.toString()
                language = movies.original_langauge.toString()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多