如果我尝试进行特定活动,应用程序崩溃

时间:2017-08-28 23:47:37

标签: java android listview

所以我正在制作一个简单的应用程序。它基本上只是在最后用自定义列表视图制作胜利列表。

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

如果我浏览添加按钮,添加葡萄酒,然后转到列表,它可以正常工作。我可以看清单。如果我不在列表中添加任何内容,它甚至可以工作。我可以看到空列表活动。

当我按下"转到列表"然而,主屏幕上的按钮崩溃并说“#34;应用程序已停止"。

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

我能得到一些帮助吗?

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

AddActivity:

{"Item":"12","Sourcing Reason":"corr","Postal Code":"l45","OrderNum":"10023","Intended Node Distance":1125.8,"Chosen Node":"34556","Quantity":1,"Order Date":1503808765201,"Intended Node":"001","Chosen Node Distance":315.8,"Sourcing Logic":"reducesplits"}

ListActivity:

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();
}
}

}

MainActivity:

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);

}

}

1 个答案:

答案 0 :(得分: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的意图中的附加内容。

由于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

希望有所帮助!