Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在第二个活动中,通过intent通过Parcelable从检索到的ArrayList获取ArrayList的元素_Java_Android_Arraylist_Parcelable - Fatal编程技术网

Java 在第二个活动中,通过intent通过Parcelable从检索到的ArrayList获取ArrayList的元素

Java 在第二个活动中,通过intent通过Parcelable从检索到的ArrayList获取ArrayList的元素,java,android,arraylist,parcelable,Java,Android,Arraylist,Parcelable,我正在尝试构建一个简单的安卓系统,它可以模拟使用卡片学习词汇。为了实现最终的应用程序,我将通过学习新事物和添加新事物,逐步增加功能和复杂性 我将告诉你我的困境,但首先,我的应用程序应该做些什么,到目前为止(我离我想让它去的地方还很远,但你不必介意) 此时,应用程序应执行以下操作: 1) 在主要活动中: a) 创建的实现的3个实例的数组 可包裹接口(类VOCARD实现可包裹),VOCARD[] voc1,在这种情况下。由于类VOCARD实现了Parcelable,因此 将获得用于构建3个实例的地

我正在尝试构建一个简单的安卓系统,它可以模拟使用卡片学习词汇。为了实现最终的应用程序,我将通过学习新事物和添加新事物,逐步增加功能和复杂性

我将告诉你我的困境,但首先,我的应用程序应该做些什么,到目前为止(我离我想让它去的地方还很远,但你不必介意)

此时,应用程序应执行以下操作:

  • 1) 在主要活动中:
  • a) 创建的实现的3个实例的数组 可包裹接口(类VOCARD实现可包裹),VOCARD[] voc1,在这种情况下。由于类VOCARD实现了Parcelable,因此 将获得用于构建3个实例的地块

  • b) 创建一个名为vocCardList的VocCard类型的ArrayList并添加 voc1的所有3个元素都被添加到voc1卡列表中
  • c) 创建“开始”按钮的实例,该按钮为 单击时启动名为PracticeActivity的第二个活动
  • d) 将带有Parcelable的ArrayList和CardList添加到 意图
2) 在实践活动中
  • a) 获取MainActivity创建的意图
  • b) 从intent检索ArrayList和CardList
  • c) 获取vocCardsList的任何元素,并指定该类型的变量 这是我的名片
  • d) 通过调用其 方法
  • e) 通过将TextView设置为值的字符串来显示该值 价值观
  • f) 创建一个按钮nextButton,用于创建启动意图 第二个活动再次练习活动,作为某种递归
  • g) 将ArrayList和CardList中的parcelable添加到intent
  • h) 重复2)a)-g)直到应用程序通过关闭图标关闭
我目前的状态是2)c),因为该应用程序只能按照上述索引0的方式工作。仅VOCARD card0=VOCARDLIST1.get(0);works,vocardlist1.get(1)或vocardlist1.get(2);尽管1和2在ArrayList边界内,但不要这样做

奇怪的是,使用索引1和索引2的运行时验证消息并不相同:

使用vocCardList1.get(1):
java.lang.ClassCastException:java.lang.String不能强制转换为com.undiclosed.smartcards.VocCard

使用vocCardList1.get(2):
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String com.unclosed.smartcards.VocCard.returnVocfeign()”

问题: 为什么我不能按预期的方式访问ArrayList的元素?当我在网上搜索的时候,我可能找错了东西

MainActivity.java:

package com.undisclosed123.smartcards;

import android.content.Intent;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private List<VocCard> vocCardList;
    private String[] voc_f = {"bread","apple","water"};
    private String[] voc_n = {"pain","pomme","eau"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Create VocCards and add to List
        vocCardList = new ArrayList<VocCard>();
        VocCard[] voc1 = new VocCard[3];
        Parcel in = Parcel.obtain();

        for(int i = 0; i < 3; i++){

            voc1[i] = new VocCard(in);
            voc1[i].setVocForeign(voc_f[i]);
            voc1[i].setVocNative(voc_n[i]);
            vocCardList.add(voc1[i]);
        }
        // Create Intent and assign the parcelable List for sending to second activity on btn click
        Button startBtn = (Button) findViewById(R.id.button);
        startBtn.setOnClickListener(new View.OnClickListener() {
             @Override
             @SuppressWarnings("unchecked")
             public void onClick(View v) {
                 Intent intent = new Intent(MainActivity.this, PracticeActivity.class);
                 intent.putParcelableArrayListExtra("voc1",(ArrayList)vocCardList);
                 getApplicationContext().startActivity(intent);
             }
        });
    }
}
package com.unclosed123.smartcards;
导入android.content.Intent;
导入android.os.packet;
导入android.os.Parcelable;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
导入java.util.ArrayList;
导入java.util.List;
公共类MainActivity扩展了AppCompatActivity{
私人名单和信用卡名单;
私有字符串[]voc_f={“面包”、“苹果”、“水”};
私有字符串[]voc_n={“pain”、“pomme”、“eau”};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建卡片并添加到列表中
vocCardList=newarraylist();
VOCARD[]voc1=新的VOCARD[3];
Parcel in=Parcel.get();
对于(int i=0;i<3;i++){
voc1[i]=新的voc1卡(in);
voc1[i].setVocForeign(voc_f[i]);
voc1[i].setvocinate(voc_n[i]);
新增(voc1[i]);
}
//创建意图并分配包裹列表,以便在btn单击时发送到第二个活动
按钮startBtn=(按钮)findViewById(R.id.Button);
startBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
@抑制警告(“未选中”)
公共void onClick(视图v){
意向意向=新意向(MainActivity.this、PracticeActivity.class);
intent.putParcelableArrayListExtra(“voc1”,(ArrayList)VOCARDLIST);
getApplicationContext().startActivity(intent);
}
});
}
}
以及下面的PracticeActivity.java:

package com.undisclosed123.smartcards;

import android.content.Intent;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private List<VocCard> vocCardList;
    private String[] voc_f = {"bread","apple","water"};
    private String[] voc_n = {"pain","pomme","eau"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Create VocCards and add to List
        vocCardList = new ArrayList<VocCard>();
        VocCard[] voc1 = new VocCard[3];
        Parcel in = Parcel.obtain();

        for(int i = 0; i < 3; i++){

            voc1[i] = new VocCard(in);
            voc1[i].setVocForeign(voc_f[i]);
            voc1[i].setVocNative(voc_n[i]);
            vocCardList.add(voc1[i]);
        }
        // Create Intent and assign the parcelable List for sending to second activity on btn click
        Button startBtn = (Button) findViewById(R.id.button);
        startBtn.setOnClickListener(new View.OnClickListener() {
             @Override
             @SuppressWarnings("unchecked")
             public void onClick(View v) {
                 Intent intent = new Intent(MainActivity.this, PracticeActivity.class);
                 intent.putParcelableArrayListExtra("voc1",(ArrayList)vocCardList);
                 getApplicationContext().startActivity(intent);
             }
        });
    }
}
(对于那些被注释掉的大部分,我感到很抱歉,我认为这有助于传达我对该课程的进一步意图)

package com.unclosed123.smartcards;
导入android.content.Intent;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.Button;
导入android.widget.TextView;
导入java.util.ArrayList;
公共课堂实践活动扩展了课堂实践活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_practice);
//获取启动此活动的意图并提取字符串
Intent=getIntent();
final ArrayList vocCardList1=intent.getParcelableArrayListExtra(“voc1”);//
//从语音卡中获取数据
//VOCARD card4count=VOCARDLIST1.get(2);
//card4count.increaseCount();
//int count=card4count.getCount();
/*如果(计数>=vocCardList1.size()){
//待办事项
//为EndPracticeActivity创建新的意图
//临时声明
计数--;
}*/
VOCARD card0=VOCARDLIST1.get(2);
//VOCARD card1=VOCARDLIST1.get(1);
字符串test1=card0.returnVocForeign();
//card0.increaseCount();
//字符串test1=“test1”;
//使文本视图显示传输的字符串
Te
package com.undisclosed123.smartcards;

import android.os.Parcel;
import android.os.Parcelable;

public class VocCard implements Parcelable {
    private String voc_foreign;
    private String voc_native;
    private boolean learned;
    private int error_level;
    private static int counter;

    public String returnVocForeign(){
        return voc_foreign;
    }

    public void setVocForeign(String voc_f){
        voc_foreign = voc_f;
    }

    public String returnVocNative(){
        return voc_native;
    }

    public void setVocNative(String voc_n){
        voc_native = voc_n;
    }

    public boolean checkLearned(){
        return learned;
    }

    public int getErrorLevel(){
        return error_level;
    }

    public void makeLearned(){
        learned = true;
    }

    public void increaseErrorLevel(){
        error_level++;
    }

    public int getCount(){
        return counter;
    }

    public void increaseCount(){
        counter++;
    }

    public VocCard(Parcel in) {
        voc_foreign = in.readString();
        voc_native = in.readString();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(voc_foreign);
        dest.writeString(voc_native);
        dest.writeInt((Boolean) learned ? 1 : 0);
        dest.writeInt(error_level);
    }

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

    public static final Creator<VocCard> CREATOR = new Creator<VocCard>() {
        @Override
        public VocCard createFromParcel(Parcel in) {
            return new VocCard(in);
        }

        @Override
        public VocCard[] newArray(int size) {
            return new VocCard[size];
        }
    };
}
public class VocCard implements Parcelable {

    ...
    ...

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(voc_foreign);
        dest.writeString(voc_native);
        dest.writeInt(learned ? 1 : 0);
        dest.writeInt(error_level);
    }

    /**
    * This constructor is invoked by the method 
    * createFromParcel(Parcel source) of the object CREATOR.
    * 
    * The order and number of writing and reading data to and from   
    * Parcel should be same 
    **/
    private VocCard(Parcel in) {
        voc_foreign = in.readString();
        voc_native = in.readString();
        learned = in.readInt() == 1;
        error_level = in.readInt();
    }

    /**
    * A constructor that initializes the VocCard object. 
    **/
    VocCard(String voc_foreign, String voc_native) {
        this.voc_foreign = voc_foreign;
        this.voc_native = voc_native;
    }

    ...
    ...

}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {

    ...
    ...

    //Create VocCards and add to List
    mVocCardList = new ArrayList<>(3);

    for (int i = 0; i < 3; i++) {
        mVocCardList.add(new VocCard(voc_f[i], voc_n[i]));
    }

    Button startBtn = (Button) findViewById(R.id.button);
    startBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this, PracticeActivity.class);
            intent.putParcelableArrayListExtra("voc1", (ArrayList<? extends Parcelable>) mVocCardList);
            startActivity(intent);
        }
    });
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {

    ...
    ...

    final ArrayList<VocCard> vocCardList = getIntent().getParcelableArrayListExtra("voc1");

    final VocCard card = vocCardList.get(2);
    String test = card.getVocForeign();

    ... 
    ...

}