2017-08-28 51 views
0

所以我正在制作一个简单的应用程序。这只是基本上在最后使用自定义列表视图制作胜利列表。如果我尝试去特定活动,应用程序崩溃

它在有两个按钮的主屏幕上开始,其中一个是“添加”按钮,将您带到添加活动。如果你推送它,它会带你进入一个页面,在其中输入葡萄酒的名称,价格和描述,然后点击提交按钮到列表中。主屏幕上的另一个按钮是一个“转到列表”按钮,它将您直接带到列表活动。

如果我通过添加按钮,添加一个酒,然后转到列表,它工作正常。我可以看到列表。它甚至可以工作,如果我没有添加任何东西到列表中。我可以看到空列表活动。

当我按下主屏幕上的“转到列表”按钮时,它崩溃并显示“应用程序已停止”。

我不明白为什么我可以通过添加按钮来到列表中,但这个按钮根本不起作用。

我可以得到一些帮助吗?

以下是三个相关的活动,AddActivity,ListActivity和MainActivity。

AddActivity:

public class AddActivity extends AppCompatActivity { 


EditText editWineName; 
EditText editWinePrice; 
EditText editWineDescription; 
Button btnSubmit; 
Button btnGoToList; 
String stringWineName; 
String stringWinePrice; 
String stringWineDescription; 
ArrayList<String> listWineName = new ArrayList<>(); 
ArrayList<String> listPrice = new ArrayList<>(); 
ArrayList<String> listWineDescription = new ArrayList<>(); 

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



    btnSubmit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      setVariables(); 
      listWineName.add(stringWineName); 
      listPrice.add(stringWinePrice); 
      listWineDescription.add(stringWineDescription); 
      Toast.makeText(AddActivity.this, stringWineName + " was added to the list.", Toast.LENGTH_SHORT).show(); 
      clearEditText(); 

     } 
    }); 

    btnGoToList.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intentGoToList = new Intent(AddActivity.this,ListActivity.class); 
      intentGoToList.putStringArrayListExtra("WINENAME", listWineName); 
      intentGoToList.putStringArrayListExtra("WINEPRICE", listPrice); 
      intentGoToList.putStringArrayListExtra("WINEDESCRIPTION", listWineDescription); 
      startActivity(intentGoToList); 
     } 
    }); 

} 

private void setVariables(){ 
    editWineName = (EditText) findViewById(R.id.editName); 
    editWinePrice = (EditText) findViewById(R.id.editPrice); 
    editWineDescription = (EditText) findViewById(R.id.editDescription); 
    btnSubmit = (Button) findViewById(R.id.btnSubmit); 
    btnGoToList = (Button) findViewById(R.id.btnGoToList); 
    stringWineName = editWineName.getText().toString(); 
    stringWinePrice = "$" + editWinePrice.getText().toString(); 
    stringWineDescription = editWineDescription.getText().toString(); 
} 

private void clearEditText() { 
    editWineName.getText().clear(); 
    editWinePrice.getText().clear(); 
    editWineDescription.getText().clear(); 
} 
} 

ListActivity:

public class ListActivity extends AppCompatActivity { 

ListView wineList; 
ArrayAdapter adapter; 
Button btnBacktoMain; 

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



    ArrayList<String> listWineName = getIntent().getStringArrayListExtra("WINENAME"); 
    ArrayList<String > listWinePrice = getIntent().getStringArrayListExtra("WINEPRICE"); 
    ArrayList<String> listWineDescription = getIntent().getStringArrayListExtra("WINEDESCRIPTION"); 

    adapter = new CustomAdapter(this, listWineName, listWinePrice, listWineDescription); 
    wineList.setAdapter(adapter); 


    btnBacktoMain.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intentBackToMain = new Intent(ListActivity.this,MainActivity.class); 
      startActivity(intentBackToMain); 
     } 
    }); 

} 

private void setVariables(){ 
    btnBacktoMain = (Button) findViewById(R.id.btnBackToMain); 
    wineList = (ListView) findViewById(R.id.listWine); 

} 

}

MainActivity:

public class MainActivity extends AppCompatActivity { 

Button btnAdd; 
Button btnList; 

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

    btnAdd.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) {            //Goes to the add activity 
      Intent intentAdd = new Intent(MainActivity.this, AddActivity.class); 
      startActivity(intentAdd); 
     } 
    }); 

    btnList.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) {            //Goes to the list activity 
      Intent intentList = new Intent(MainActivity.this, ListActivity.class); 
      startActivity(intentList); 
     } 
    }); 
} 

private void setVariables(){ 
    btnAdd = (Button) findViewById(R.id.btnAddWine); 
    btnList = (Button) findViewById(R.id.btnViewList); 
} 

}

+0

嘿 - 当你的应用程序崩溃时,你需要做两件事:首先,检查显示错误类型的错误日志以及堆栈跟踪的崩溃日志。如果这不能清楚地告诉你这个问题,请使用你的调试器来检查你的代码。 https://developer.android.com/studio/debug/index.html。如果您仍然无法弄清楚,请帮助我们并发布堆栈跟踪,否则我们只是猜测可能导致您的问题的原因。 – dominicoder

+0

对不起。以下是我收到的错误消息.https://pastebin.com/7ygPNsqm – jeremytodd1

回答

0
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference 
    at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:344) 
    at android.widget.ListView.setAdapter(ListView.java:493) 
    at com.example.jeremy.mywine.ListActivity.onCreate(ListActivity.java:33) 

您的崩溃表明给予ListActivity中的ListView的适配器中的数据为空。使它不为空。在第33行从ListActivity.java开始,然后向后找到你在哪里(或者这种情况不是)初始化列表适配器中的数据。

在你的情况下,你期望数据在你的意图。好的,你的意图在哪里设置?在你的MainActivity中点击。那么,您只需开展活动,但不会传递任何意向附加信息中的数据,因此没有什么可以从ListActivity的意图中撤出,因此您的崩溃。

因此,您需要初始化MainActivity中的数据,并将其设置为用于启动ListActivity的Intent中的额外数据。

由于ListActivity期待这样的:

ArrayList<String> listWineName = getIntent().getStringArrayListExtra("WINENAME"); 
ArrayList<String > listWinePrice = getIntent().getStringArrayListExtra("WINEPRICE"); 
ArrayList<String> listWineDescription = getIntent().getStringArrayListExtra("WINEDESCRIPTION"); 

你会更新MainActivity做这样的事情(其中getDescriptions()是一个虚构的方法,你能创建返回字符串列表)

btnList.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     //Goes to the list activity 
     Intent intentList = new Intent(MainActivity.this, ListActivity.class); 
     intentList.putExtra("WINENAME", new ArrayList<String>());  // Empty list 
     intentList.putExtra("WINEPRICE", Arrays.asList("Foo", "Bar")); // Explicit list named items 
     intentList.putExtra("WINEDESCRIPTION", getDescriptions()); // Get list from private method 
     startActivity(intentList); 
    } 
}); 

另请检查this post我对学习如何阅读和理解故障日志很有帮助。

check the documentation on how to start activities

希望有帮助!

+0

我很感激帮助。我只是不明白它。 MainActivity中的按钮仅仅是一个进入ListActivity的按钮。我没有试图通过任何额外或任何东西。为什么我需要从MainActivity传递任何额外内容? MainActivity上唯一的两个按钮。 – jeremytodd1

+0

这正是你的问题。该列表活动期待三个字符串列表(名称,价格和说明),但您没有发送它们。所以繁荣就是炸药。你期望'listWineName'和其他两个来自哪里? – dominicoder

+0

因此,我现在得到ListActivity中的“ArrayList ”行要求在意图被拉起时存在数据。我现在的问题是如何插入空数据?我试过null,我没有得到它。对于那些漂亮的nooby问题,我很抱歉。我对这个东西还真是新鲜。 https://pastebin.com/ydLZAGep – jeremytodd1

相关问题