Java 在Android中使用listview显示大量数据并使用parcelable传递

Java 在Android中使用listview显示大量数据并使用parcelable传递,java,android,android-intent,android-listview,parcelable,Java,Android,Android Intent,Android Listview,Parcelable,因此,今天我正在使用listview创建一个项目,但我想用android java中的parcelable传递所有选定的值。但我有点困惑,因为我使用数组来存储数据。下面是我的MainActivity.java看起来像: package com.example.lee; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import

因此,今天我正在使用listview创建一个项目,但我想用android java中的parcelable传递所有选定的值。但我有点困惑,因为我使用数组来存储数据。下面是我的MainActivity.java看起来像:

package com.example.lee;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;

import java.util.ArrayList;

import static android.provider.Contacts.SettingsColumns.KEY;

public class MainActivity extends AppCompatActivity{

    ListView list;
    String[] title;
    int[] image;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        image = new int[]{R.drawable.poster_a_star, R.drawable.poster_aquaman, R.drawable.poster_avengerinfinity, R.drawable.poster_birdbox,
                            R.drawable.poster_bohemian};

        title = new String[]{"A Star is Born", "Aquaman", "Avengers Infinity War", "Bird Box", "Bohemian Rhapsody"};


        ListViewAdapters adapters = new ListViewAdapters(MainActivity.this, image, title, release_info, languages, genres);
        list = (ListView)findViewById(R.id.listview_movie);
        // Binds the Adapter to the ListView
        list.setAdapter(adapters);
//         Capture ListView item click
            list.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                                        int position, long id) {
                    ArrayList<Movie> movies = new ArrayList<>();
                    Movie movie = new Movie();
                    Intent i = new Intent(MainActivity.this, ObjectReceived.class);

                i.putExtra("title",title);
                // Pass listview item click position
                i.putExtra("position", position);
                //Pass image item click image
                i.putExtra("image", image);
                // Open SingleItemView.java Activity
                startActivity(i);
            }

        });
    }
}

列表视图已成功显示,但每当我单击其中一个项目时,应用程序将直接停止运行。我认为这是因为我没有正确地将值从MainActivity.java传递到ObjectReceived.java,但在这里我混淆了如何使用数组项传递值。请帮助我:D谢谢你

在你的onItemClick中,你正在意向包中添加3个值:

i.putExtra("title",title);           
i.putExtra("position", position);
i.putExtra("image", image);
在yout ObjectReceived活动中,您需要通过其键获取每个值

所以这不起作用:

ArrayList<Movie> movies = getIntent().getParcelableArrayListExtra(EXTRA_MOVIE);
}
放置在意向附加中的信息具有类型,您需要使用此类型信息在检索活动中从附加中检索正确的值。

参考此答案

在发送活动中:

Intent i = new Intent(MainActivity.this, ObjectReceived.class);

ArrayList<Movie> movieArray = new ArrayList<Movie>();

i.putParcelableArrayListExtra("array", movieArray);
i.putExtra("title",title);
i.putExtra("position", position);
i.putExtra("image", image);
startActivity(i);
Intent i=新的Intent(MainActivity.this、ObjectReceived.class);
ArrayList movieArray=新的ArrayList();
i、 putParcelableArrayListExtra(“阵列”,电影阵列);
i、 putExtra(“标题”,标题);
i、 putExtra(“位置”,位置);
i、 putExtra(“图像”,图像);
星触觉(i);
在接收活动中:

ArrayList<Movie> movieArray = this.getIntent().getParcelableArrayListExtra("array");
List<Movie> movieList = new ArrayList<>();
 Intent intent = getIntent();
    if (intent != null) {
        movieList = intent.getParcelableArrayListExtra("MovieList");
        Movie movie = movieList.get(0);
        int image = movie.getImage();
        String title = movie.getTitle();
    }
ArrayList movieArray=this.getIntent().getParcelableArrayListExtra(“数组”);

因此您只想从listview中传递选定的项目数据

您可以简单地执行以下操作

list.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
                                        int position, long id) {
           Intent i = new Intent(MainActivity.this, ObjectReceived.class);

           String movieTitle = title[position]; // selected item title
           int movieImage = image[position]; // selected item image

           i.putExtra("title",movieTitle);
           i.putExtra("position", position);
           i.putExtra("image", movieImage);
           startActivity(i);
   }

});
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_object_received);
        TextView tvObject = findViewById(R.id.object_received);

        // get your data like below.
        String title = getIntent().getStringExtra("title");
        int image = getIntent().getIntExtra("image");
        int position = getIntent().getIntExtra("position");
        Log.d("YOUR_TAG", "Title: "+title);

        // create movie object like below
        Movie movie = new Movie()
        movie.setTitle(title);
        movie.setImage(image);
        //........
}
  • 如果您想使用
    Intent
    传递
    ArrayList
    ,那么这个可能会对您有所帮助

  • 您希望使用下面的代码将数据从一个活动传递到另一个活动

     button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, YourActivity.class);
            Bundle args = new Bundle();
            args.putSerializable("name",list);
            intent.putExtra("namelist",args);
            context.startActivity(intent);
    
  • 在要获取意图的活动中,请使用下面的代码

     ArrayList<YourModelName> arraylistname = new ArrayList<>();
    
    Intent intent1 = getIntent();
    Bundle bundle1 = intent1.getBundleExtra("namelist");
    arraylistname = (ArrayList<YourModelName>)   
    bundle1.getSerializable("name");
    
    ArrayList arraylistname=new ArrayList();
    Intent intent1=getIntent();
    Bundle bundle1=intent1.getBundleExtra(“名称列表”);
    arraylistname=(ArrayList)
    bundle1.getSerializable(“名称”);
    
  • 并使用
    Serializable


如何将ArrayList从一个活动传递到另一个活动:

 ArrayList<Movie> movies = new ArrayList<>();
    Movie movie = new Movie();
    movie.setTitle(title[position]);
    movie.setImages(image[position]);
    movies.add(movie);
    Intent i = new Intent(MainActivity.this, ObjectReceived.class);
    i.putParcelableArrayListExtra("MovieList", (ArrayList<? extends Parcelable>) movies);
ArrayList movies=new ArrayList();
电影=新电影();
电影片名(片名[位置]);
movie.setImages(图像[位置]);
添加(电影);
意图i=新意图(MainActivity.this、ObjectReceived.class);

i、 putParcelableArrayListExtra(“MovieList”),(ArrayList好的,谢谢你们帮助我!现在我的代码运行良好!我尝试了这个

 String mTitle= screenplays[position];
 intmImage= overview[position];
i.putExtra("title",mTitle);
// Pass all data title
i.putExtra("image", mImage);
// Pass all data image
这是用来接收值的

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_object_received);
        TextView tvObject = findViewById(R.id.object_received);
        tvObject.setText(getIntent().getStringExtra("title"));

    }

但是这个没有实现POJO类Post错误消息我已经发布了错误@sravsy您没有将数组添加到setOnItemClickListenter@Leony您想使用intent通过arraylist吗?请查看此链接,它将帮助您:我确实尝试了您的答案,但当我单击存储在数组中的某个数据时,它并不是string、 xml,第二个活动没有收到任何数据,完全为空
 ArrayList<Movie> movies = new ArrayList<>();
    Movie movie = new Movie();
    movie.setTitle(title[position]);
    movie.setImages(image[position]);
    movies.add(movie);
    Intent i = new Intent(MainActivity.this, ObjectReceived.class);
    i.putParcelableArrayListExtra("MovieList", (ArrayList<? extends Parcelable>) movies);
List<Movie> movieList = new ArrayList<>();
 Intent intent = getIntent();
    if (intent != null) {
        movieList = intent.getParcelableArrayListExtra("MovieList");
        Movie movie = movieList.get(0);
        int image = movie.getImage();
        String title = movie.getTitle();
    }
 String mTitle= screenplays[position];
 intmImage= overview[position];
i.putExtra("title",mTitle);
// Pass all data title
i.putExtra("image", mImage);
// Pass all data image
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_object_received);
        TextView tvObject = findViewById(R.id.object_received);
        tvObject.setText(getIntent().getStringExtra("title"));

    }