更新ArrayAdapter后,Android Firebase应用程序崩溃

时间:2017-11-22 04:44:16

标签: java android firebase android-arrayadapter

您好我正在处理我的第一个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}

1 个答案:

答案 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": { ... }
     }
}