如果这看起来令人费解,请提前道歉,但这会让我发疯:/
在我的主活动中,我创建了一个数组列表:-
final ArrayList<Song> songs = new ArrayList<>();
其中填充了我创建的名为Song的自定义类的对象:-
songs.add(new Song("Highway to Hell", "ACDC", "3:28", "Rock", "Highway to Hell", "1979"));
在Listview中使用:-
SongAdapter adapter = new SongAdapter(this, songs);
final ListView listView = findViewById(R.id.list);
listView.setAdapter(adapter);
这些ArrayList对象用于在Mainactive的ListView中显示它们的一些信息(歌曲和艺术家),每个视图都有一个onClickListener。
当按下ListView TextView时,我将数组位置存储到类型为Song的arrayObject中:-
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// get pressed object
arrayObject = songs.get(position);
}
});
然后当按下另一个按钮时(再次在onClickListener上),我将当前数组对象(arrayObject)发送到另一个活动:-
Intent detailsIntent = new Intent(MainActivity.this, SongDetailsActivity.class);
detailsIntent.putExtra("SongObject", arrayObject);
startActivity(detailsIntent);
当我在MainActivity和Song自定义类上实现Serializable时,它工作得很好。
**问题**
我还有一个ImageView(可以是两个源图像中的一个),我希望将其传递给另一个活动,因此我可以将该活动上显示的图像设置为与主活动上显示图像匹配。
它正在添加我无法使用的ImageView。我尝试过像这样将其作为Drawable发送(在将Drawable方法添加到自定义类之后):-
songs.add(new Song("November Rain", "Guns N' Roses", "8:57", "Rock", "Use Your Illusion I", "1991",getResources().getDrawable( R.drawable.playbutton)));
哪个Android Studio似乎很乐意编译,但当我运行应用程序并尝试将视图更改为其他活动时,我得到了一个错误:-
2018-12-04 08:33:44.453 13324-13324/com.example.android.musicplayer E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.musicplayer, PID: 13324
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.android.musicplayer.Song)
at android.os.Parcel.writeSerializable(Parcel.java:1526)
at android.os.Parcel.writeValue(Parcel.java:1474)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:723)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408)
at android.os.Bundle.writeToParcel(Bundle.java:1133)
at android.os.Parcel.writeBundle(Parcel.java:763)
at android.content.Intent.writeToParcel(Intent.java:8655)
at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3052)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1518)
at android.app.Activity.startActivityForResult(Activity.java:4224)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
at android.app.Activity.startActivityForResult(Activity.java:4183)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
at android.app.Activity.startActivity(Activity.java:4507)
at android.app.Activity.startActivity(Activity.java:4475)
at com.example.android.musicplayer.MainActivity$2.onClick(MainActivity.java:103)
at android.view.View.performClick(View.java:5610)
这是抱怨可序列化对象,但我不知道可序列化对象有什么问题。
我还尝试在自定义类和MainActivity中将其设置为ImageView,但是我尝试编写它的每种方式Android Studio都会出错,甚至无法编译。
我不确定最好的方法是什么。
正如我所提到的,我只想传递ImageView中使用的当前图像,以便我可以将两个活动与同一图像同步。无论是通过引用还是实际图像,我都只想将其传达给其他活动。
如果这说不通请告诉我谢谢
绘图对象不能序列化。
最快的解决方法是将< code > r . drawable . play button (它是一个整数)发送给intent——在您的示例中,是通过< code>Song类。然后,在< code>SongDetailsActivity中,您可以在使用< code>getResources()从意图中检索drawable后加载它。getDrawable(...)。
这与您在实现一个Parcelable时要做的事情是一样的。
以下是您应该拥有的:
//Song class should implement a parcelable
public class Song implements Parcelable{
//....
//....
private int drawable;
public Song(..., ..., int drawable){
this.drawable = drawable;
}
private Song(Parcel in) {
//...
//...
drawable = in.readInt();
}
public static final Creator<Song> CREATOR = new Creator<Song>() {
@Override
public Song createFromParcel(Parcel in) {
return new Song(in);
}
@Override
public Song[] newArray(int size) {
return new Song[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//...
//...
dest.writeInt(drawable);
}
}
像这样将歌曲添加到数组列表
songs.add(new Song("November Rain", "Guns N' Roses", "8:57", "Rock", "Use Your Illusion I", "1991", R.drawable.playbutton));
发送数组列表到宋详细信息活动
Intent detailsIntent = new Intent(MainActivity.this, SongDetailsActivity.class);
detailsIntent.putExtra("SongObject", arrayList);
startActivity(detailsIntent);
默认情况下,ArrayList是可序列化的,但从一个意图中检索它可能很棘手,因此我们必须在歌曲上实现一个parcelable,以便<code>ArrayList
请注意创建者
只能通过Parcelables从intent中检索对象的数组列表(除了Integer、String和CharSequence)。为什么?因为默认情况下,Integer、String和CharSequence是序列化的;物体不是。
在SongDetailsActivity中获取arrayList
Intent intent = getIntent();
ArrayList<Parcelable> songs = intent.getParcelableArrayListExtra("SongObject");
//retrieve each song
for(Parcelable parcelable : songs){
Song song = (Song) parcelable;
//load the drawable now
getResources().getDrawable(song.drawableInt)
}
PS:上面的代码片段尚未测试,因为您正在使用许多其他参数实现。但如果你正确地插入它们,它应该会工作。
可序列化对象的任何关联对象都必须实现它自己的可序列化,或者必须包含
readObject(ObjectInputStream ois)
和writeObject(object OutputStream oos)
,否则会出现运行时错误-这就是您的情况。
根据以下评论更新:
要在SongDetailsActivity中仅获取一个Song对象,您可以向从适配器的getView呈现时在ListView中单击的视图添加标记,如下所示:
public View getView(int position, View convertView, ViewGroup parent){
Song song = getItem(position);
ViewHolder viewHolder;
if(convertView == null){
//set viewHolder
}else{
viewHolder = (ViewHolder)convertView.getTag();
}
viewHolder.itemToClick.setTag(R.id.item_id, song);
}
然后检索歌曲并发送到onClick中的活动
public void onClick(View view) {
Song song = (Song) view.getTag(R.id.item_id);
if(song != null){
//Send intent
//It is cleaner if you do this in the Activity, but for illustration sake
Intent detailsIntent = new Intent(MainActivity.this, SongDetailsActivity.class);
detailsIntent.putExtra(Intent.EXTRA_TEXT, song);
startActivity(detailsIntent);
}
}
然后在歌曲中检索详细活动
Intent intent = getIntent();
Song song = intent.getParcelableExtra(Intent.EXTRA_TEXT);
//load the drawable now
getResources().getDrawable(song.drawableInt);
你的歌曲课应该是这样的
public class Song implements Parcelable {
String name;
String singer;
String duration;
String genre;
String album;
String year;
String imagetype;
public Song() {} //your custom constructor
protected Song(Parcel in) {
name = in.readString();
singer = in.readString();
duration = in.readString();
genre = in.readString();
album = in.readString();
year = in.readString();
imagetype = in.readString();
}
public static final Creator<Song> CREATOR = new Creator<Song>() {
@Override
public Song createFromParcel(Parcel in) {
return new Song(in);
}
@Override
public Song[] newArray(int size) {
return new Song[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(singer);
dest.writeString(duration);
dest.writeString(genre);
dest.writeString(album);
dest.writeString(year);
dest.writeString(imagetype);
}
}
然后,单击列表视图发送当前选定歌曲的数据
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// get pressed object
arrayObject = songs.get(position);
Intent detailsIntent = new Intent(MainActivity.this, SongDetailsActivity.class);
detailsIntent.putExtra("SongObject", arrayObject);
startActivity(detailsIntent);
}
});
你有数据吗
新歌(“十一月雨”,“枪与玫瑰”,“8:57”,“摇滚”,“使用你的幻觉I”,“1991”,“源”));
在SongDetailsActivity.class你应该检查图像类型
Song s = getIntent().getParcelableExtra("SongObject");
if (s.imagetype.equals("sourceone")) {
imageView.setImageResource(R.drawable.playbutton);
} else {
imageView.setImageResource(R.drawable.elsebutton);
}
同样的事情,如果您想拥有相同的图像,您需要在适配器中检查图像类型。希望它能有所帮助。
你不能把绘图在捆绑,因为它也不是可序列化的参数。我看到它是一个演示应用程序,我会给你一个快速的解决方案,但记得阅读关于序列化。
在Song对象中保存绘图对象的名称,使用此函数您可以通过其名称获取绘图对象(保留它):
public static int getImage(Context context, String imageName) {
int drawableResourceId = context.getResources().getIdentifier(imageName, "drawable", context.getPackageName());
return drawableResourceId;
}
将Song类中的drawable参数更改为String,并按照以下说明操作:
songs.add(new Song("November Rain", "Guns N' Roses", "8:57", "Rock", "Use Your Illusion I", "1991", "playbutton"));
int resource = getImage(activity, song.getImage());
Drawable drawable = getResources().getDrawable(resource);
应提问者的要求更改
我觉得你的歌曲课是这样的:
class Song {
String name;
String singer;
String duration;
String genre;
String lyrics;
String year;
Drawable image;
}
将其更改为:
class Song implements Serializable {
String name;
String singer;
String duration;
String genre;
String lyrics;
String year;
String image;
}
相反
new Song("November Rain", "Guns N' Roses", "8:57", "Rock", "Use Your Illusion I", "1991",getResources().getDrawable( R.drawable.playbutton));
使用
new Song("November Rain", "Guns N' Roses", "8:57", "Rock", "Use Your Illusion I", "1991", "playbutton");
现在你可以像这样传递对象:
Intent detailsIntent = new Intent(MainActivity.this, SongDetailsActivity.class);
detailsIntent.putExtra("SongObject", arrayObject);
startActivity(detailsIntent);
问题内容: 我有以下数据 我得到一个 到目前为止,很好,我有一个数据结构,可以按列名进行寻址 下一个步骤,问题- 我有一个功能,在输入有地理坐标(的两个向量和当然的),并返回两个阵列和在地图上突出位置(此工程确定)。 我可以使用单独的向量,但是我想添加两个新列和。我的天真尝试 提出了一个,教我说它具有字典的某些特征,但是字典却没有。 我可以做吗?tia 请考虑这不适用于结构化数组或记录数组,大多数
在有趣的功能中,当我将列表添加到其他列表时,它正在添加空列表,我可以找到原因有人可以帮助我这个程序是关于查找给定数组的不同组合
easyopen序列化使用fastjson处理json,xstream处理xml。现在我们来自定义实现一个json处理: 新建一个类JsonFormatter,实现ResultSerializer接口 public class JsonFormatter implements ResultSerializer { @Override public String serialize(
正如标题所述,我正在尝试将自定义属性添加到我返回的序列化对象中。 让我们用以下方法来介绍一个用户: getFirstname、setFirstname 现在在序列化中,我想添加一个属性fullName: Firstname Lastname。 我的实体中有一个getter方法,如下所示: 我的序列化文件如下所示: 我试过了 和其他变体,但我似乎不能得到它的权利。 注意:是的,我已清除缓存并重试 有
我有一个从sqlite数据库接收阵列的基本适配器: 并在异步中填充它: 但我不知道如何为每个条目添加图像,请注意,图像位于文件夹中,图像的名称属于每个条目,例如对于条目管理,在/storage/sdcard/pictures/admin_image1中有一个图像。jpg。因此,当我有条目的名称时,我可以将图像绑定到特定条目。 我需要的是如何将图像添加到此适配器,这里我发布了主要活动和适配器代码,抱
我想在Sokoban游戏中保存我的玩家角色的步骤。首先我想用字符的实际位置填充一个int x和y的数组,称为“pos”。然后我想将这个数组添加到数组的ArrayList中,称为“moves”。 一个玩家位置的阵列: ArrayList为所有步骤,玩家在关卡: 如果将“int[]”放在ArrayList的尖括号内,则会出错。 如何将阵列位置添加到ArrayList移动?