gpt4 book ai didi

java - 如何正确实现 SparseArray 以在 ViewPager 的每个实例上存储自定义对象? Android 开发 - Java

转载 作者:行者123 更新时间:2023-12-01 12:46:20 26 4
gpt4 key购买 nike

首先,我要提前感谢大家的时间和帮助。我的问题可能是一个基本且愚蠢的问题。然而,我是一个初学者,我想这是一个学习的好地方!

所以,我有一个名为 Question 的自定义对象,它在 Question.java 中进行了描述;它看起来像这样:

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





public class Question implements Parcelable{
String mark;
String total;
String worth;

public Question(String amark, String atotal, String aworth ) {
mark = amark;
total = atotal;
worth = aworth;

}

public Question(Parcel in) {

mark = in .readString();
total = in .readString();
worth = in .readString();


}

@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
private void readFromParcel(Parcel in ) {

mark = in .readString();
total = in .readString();
worth = in .readString();

}

@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeString(mark);
dest.writeString(total);
dest.writeString(worth);

}

public static final Parcelable.Creator<Question> CREATOR = new Parcelable.Creator<Question>() {
public Question createFromParcel(Parcel in) {
return new Question(in);
}

public Question[] newArray(int size) {
return new Question[size];
}
};
}

现在我正在创建用户定义数量的表单来收集用户的信息。所以我试图创建一个 SparseArray,其中每个条目都包含一个 Question 对象(这样我就可以将所有这些信息传递给另一个 Activity 来实现)。现在看来,我已经完成了所有的工作。但是,因为每次打开我的 UserFragment.java (每个“表单”都是 UserFragment 的一个实例,由 FirstFragment.java 控制,这是创建 View 页面的 Activity ),基本上我会创建一个新的 SparseList 问题,因为我的 UserFragment.java看起来像这样:

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class UserFragment extends Fragment {


public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.layout_avgcalcform,
container, false);

final int pagetotal = getArguments().getInt("size");


TextView tv = (TextView) rootView.findViewById(R.id.avg_testtv);
tv.setText(String.valueOf(getArguments().getInt("page_position")));
String Text;
if(pagetotal==getArguments().getInt("page_position")){
Text = "Submit";
} else
Text = "next";

Button b = (Button) rootView.findViewById(R.id.button1);
b.setText(Text);
b.setOnClickListener( new View.OnClickListener(){

public void onClick(View v){
//Extracting the information from the user input forms! NOTE:NEED TO ADD ERROR CHECKING
final EditText markc = (EditText)rootView.findViewById(R.id.editTextASSMARK);
final EditText marktotc = (EditText)rootView.findViewById(R.id.editTextASSTOT);
final EditText assvalc = (EditText)rootView.findViewById(R.id.editTextASSWORTH);
//Converting from INFO string to int
double currentassmark = Double.parseDouble(markc.getText().toString());
double currentassworth = Double.parseDouble(marktotc.getText().toString());
double currentassval = Double.parseDouble(assvalc.getText().toString());
// Determining the current viewnumber (or form number) the user is currently on.
int currentviewnum = ((FirstFragment) getActivity()).getPager().getCurrentItem();

saveData(new Question(markc.getText().toString(),marktotc.getText().toString(),assvalc.getText().toString()),currentviewnum);
((FirstFragment) getActivity()).getPager().setCurrentItem(currentviewnum+1);
double totalpercentage =(double)((currentassmark/currentassworth)*currentassval);
Bundle bundle = new Bundle();
int currentpagenumber = getArguments().getInt("page_position");
String currentpage = String.valueOf(currentpagenumber);
//bundle.putDouble(currentpage, totalpercentage);


if(pagetotal==currentpagenumber){
bundle.putString("TEST", currentpage);
Intent intent = new Intent(UserFragment.this.getActivity(), DisplayAverageActivity.class);
bundle.putInt("numberofforms", getArguments().getInt("page_position"));
bundle.putSparseParcelableArray("Questions",questions);
intent.putExtras(bundle);
startActivity(intent);

}


}
});
return rootView;

}
//this is an error, on every creation of UserFragment, it basically creates a new questions array.
// This results in only the the existance of (questions.get(lastpage).hello).
SparseArray<Question> questions = new SparseArray<Question>();
public void saveData(Question quest, int pagenumber){
questions.put(pagenumber, quest);

}



}

如果每次都不定义一个名为 Question 的新 SparseArray,我无法想出一种方法来(正确地)做到这一点。所以基本上,当我尝试访问它时,当然,唯一不给我空指针的迭代是最后一个。当我像这样访问它时: String markk = questions.get(totalasses-1).mark;只有totalasses-1 有效。所以我真的很感激,如果有人可以帮助我解决我的问题,我如何定义数组,比如说 FirstFragment.java (或 UserFragment 外部的某个地方),这样它只创建 SparseArray 一次,然后只需使用相应 View 寻呼机表单中的问题表单填写每个条目即可?

如果可以的话,请提供一些编码示例和一些解释,因为我是初学者,我确实想学习,并找到解决方案!

非常感谢。

最佳答案

您可以通过三种方法来解决这个问题。

你可以用懒惰的方式做到这一点,只需通过添加 static 关键字(即 static SparseArray<Question> questions = new SparseArray<Question>(); )使你的 SparseArray 成为静态变量

或者你可以使用Bundle并将稀疏数组存储在savedInstanceState中参数

获取数组

SparseArray<Question> questions = savedInstanceState.getSparseParcelableArray("questions");

存储它

savedInstanceState.putSparseParcelableArray("questions", questions);

但是,您的 Question类需要实现 Parcelable (编辑:没关系,我看到你已经这样做了)

第三种方法是引用一个只有一个实例的类并存储 questions变量在该类中,但您没有在帖子中提供任何其他类,所以我不知道您将把它放在哪里。

关于java - 如何正确实现 SparseArray 以在 ViewPager 的每个实例上存储自定义对象? Android 开发 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24669916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com