您好我正在处理我的第一个Android应用程序,我遇到了问题,在我将一个项目添加到数据库并尝试向UI显示其他项目后应用程序崩溃。
我正在使用Firebase和自定义ArrayAdapter
来显示数据库。
仅当我向数据库添加新项并调用updateUI()时才会出现此问题。
问题不在updateUI()
,我知道这是因为我在onCreate中调用了updateUI()
,并且数据库信息被成功提取。此外,如果我使用传统的ArrayAdapter,该过程也可以。我希望得到一些帮助,并理解为什么会出现这个问题。
这是
User.java
public void setUserInformation(String task){
String removeFirstLast = task.substring(1, task.length()-1);
String[] array = removeFirstLast.split(",");
dueDate = array[0].substring(9, array[0].length());
taskName = array[1].substring(11, array[1].length());
courseName = array[2].substring(13, array[2].length());
}
UserAdapter.java
public class UserAdapter extends ArrayAdapter<User>{
private final Context context;
private final ArrayList<User> data;
private final int layoutResourceId;
public UserAdapter(Context context, int layoutResourceId, ArrayList<User> data) {
super(context, layoutResourceId, data);
this.context = context;
this.data = data;
this.layoutResourceId = layoutResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.textView1 = (TextView)row.findViewById(R.id.task_title);
holder.textView2 = (TextView)row.findViewById(R.id.due_date);
row.setTag(holder);
}
else
{
holder = (ViewHolder)row.getTag();
}
User user = data.get(position);
holder.textView1.setText(user.getTaskName());
holder.textView2.setText(user.getDueDate() + "- " + user.getCourseName());
return row;
}
static class ViewHolder{
TextView textView1;
TextView textView2;
}
list_activity.java中的 updateUI()
存在一个问题,即从数据库中成功提取了唯一的taskName。在courseName,dueDate上收到NullPointerException
。
private void updateUI(){
final ArrayList<User> userList = new ArrayList<>();
//final ArrayList<String> taskList = new ArrayList<>();
//pull from database
Query query = myRef.child("Users").child(user_id).child("TO DO");
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds: dataSnapshot.getChildren()) {
// courseName = ds.child("Course Name").getValue().toString();
// taskName = ds.child("Task Name").getValue().toString();
// dueDate = ds.child("Due Date").getValue().toString();
String task = ds.getValue().toString();
//taskList.add(taskName);
user = new User();
userList.add(user);
user.setUserInformation(task);
// user.setCourseName(courseName);
// user.setDueDate(dueDate);
// user.setTaskName(taskName);
// Log.i("AlertDialog","Due Date Entered "+ dueDate);
// Log.i("AlertDialog","Course Name Entered "+ courseName);
// Log.i("AlertDialog","Task Name Entered "+ taskName);
Log.i("AlertDialog","Task Entered "+ task);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
if (mAdapter == null) {
// mAdapter = new ArrayAdapter<>(this,
// R.layout.list_item,
// R.id.task_title,
// taskList);
// mTaskListView.setAdapter(mAdapter);
mAdapter = new UserAdapter(this,R.layout.list_item, userList);
mTaskListView.setAdapter(mAdapter);
} else {
mAdapter.clear();
mAdapter.addAll(userList);
mAdapter.notifyDataSetChanged();
}
}
即使出现错误,数据仍然会添加到数据库中,updateUI()
成功提取数据库信息,一旦用户将新信息上传到数据库,应用程序会在再次调用updateUI()
后关闭。使用传统ArrayAdapter
时不会出现此问题。
我收到一个数组越界错误,即使我知道这不是问题。
11-21 23:38:31.883 9431-9431/com.example.android.procastinator E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.procastinator, PID: 9431
java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
at com.example.android.procastinator.User.setUserInformation(User.java:61)
at com.example.android.procastinator.list_Activity$2.onDataChange(list_Activity.java:158)
at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
以下是String任务等于
的示例{Due Date=11/25/17, Task Name=HW 6, Course Name=CSC 4360}
答案 0 :(得分:0)
我认为更好的想法是为您创建一个表数据,而不是获取字符串并解析它。并且只是将值检索为对象而不是字符串。这可能会使您免于ArraysOutOfBoundException。
Users users = ds.getValue(Users.class);
firebasedatabase中的Users表
{
"users": {
"asdfas12321": {
"Due Data": "11/25/17",
"Task Name": "Hw 6",
"Course Name": "CSC 4360",
},
"asdfa112312": { ... },
"1241dwqreq": { ... }
}
}