用户将新单词添加到列表使用的字符串数组中(应用停止运行)

时间:2018-10-01 15:52:17

标签: java android string list user-interface

我制作了一个小应用,它是一本字典。当使用吐司从列表中选择一个单词时,它将弹出含义。我添加了一项功能,该功能将允许用户添加新单词及其定义,但无法正常工作。 以下是代码:

public class MainActivity extends AppCompatActivity {


private String[] words = {
        "Ankit Rath","Mediocre","Idiot","Legend"

};

private String[] defn = {
        "Creator of this App!","Android Development","Developer","Ankit Rath"

};

private String d="";


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

    run();


}
**public void run(){
    ListView list = (ListView) findViewById(R.id.li);
    ArrayAdapter<String> adap = new ArrayAdapter<>(
            this,
            android.R.layout.simple_list_item_1,
            words
    );
    list.setAdapter(adap);
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            String de = defn[i];
            Toast.makeText(getApplicationContext(),de,Toast.LENGTH_SHORT).show();
        }
    });
}**


**public void add(View view) {
    EditText txtw = (EditText) findViewById(R.id.t1);
    String ndef = txtw.getText().toString();
    defn[defn.length] = ndef;
    EditText txtd = (EditText) findViewById(R.id.t2);
    String nword = txtd.getText().toString();
    words[words.length] = nword;
    run();
}**

public void reset1(View view) {
    EditText t1 = (EditText) findViewById(R.id.t1);
    t1.setText("");

}
public void reset2(View view) {
    EditText t2 = (EditText) findViewById(R.id.t2);
    t2.setText("");

}
}

这是代码。重要代码标有**。以下是预览: enter image description here

我希望所有这些都足以找到解决方案。请帮忙。

2 个答案:

答案 0 :(得分:0)

defn[defn.length] = ndef;将导致ArrayIndexOutOfBoundsException,因为您正尝试访问超出数组大小的索引。

您应该改用List

类似地,将List使用words

接下来,您不需要在每次数据更改时都创建新的ListViewAdapter。只需使用adap.notifyDataSetChanged()

编辑

您的程序应为:

public class MainActivity extends AppCompatActivity {


    private List<String> words;

    private List<String> defn;

    private String d="";
    ListView list;
    ArrayAdapter<String> adap;


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

        words = new ArrayList<>();
        words.add("Ankit Rath");
        words.add("Mediocre");
        words.add("Idiot");
        words.add("Legend");

        defn = new ArrayList<>();
        defn.add("Creator of this App!");
        defn.add("Android Development");
        defn.add("Developer");
        defn.add("Ankit Rath");

        run();
    }

    public void run(){
        list = (ListView) findViewById(R.id.li);
        adap = new ArrayAdapter<>(
                this,
                android.R.layout.simple_list_item_1,
                words
        );
        list.setAdapter(adap);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                String de = defn.get(i);

                Toast.makeText( getApplicationContext(),de,Toast.LENGTH_SHORT).show();
            }
        });
    }


    public void add(View view) {
        EditText txtw = (EditText) findViewById(R.id.t1);
        String ndef = txtw.getText().toString();
        defn.add(ndef);
        EditText txtd = (EditText) findViewById(R.id.t2);
        String nword = txtd.getText().toString();
        words.add(nword);
        adap.notifyDataSetChanged();
    }

    public void reset1(View view) {
        EditText t1 = (EditText) findViewById(R.id.t1);
        t1.setText("");

    }
    public void reset2(View view) {
        EditText t2 = (EditText) findViewById(R.id.t2);
        t2.setText("");

    }
}

答案 1 :(得分:0)

public class MainActivity extends AppCompatActivity {

private  ArrayList<String> words=new ArrayList<String>();
    private  ArrayList<String> defn=new ArrayList<String>();

/*private String[] words = {
        "Ankit Rath","Mediocre","Idiot","Legend"

};*/

/*private String[] defn = {
        "Creator of this App!","Android Development","Developer","Ankit Rath"

};*/

private String d="";


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

    words.add("Ankit Rath");
    words.add("Mediocre");
    words.add("Idiot");
    words.add("Legend");

    defn.add("Creator of this App!");
    defn.add("Android Development");
    defn.add("Developer");
    defn.add("Ankit Rath");


    run();


}
public void run(){
    ListView list = (ListView) findViewById(R.id.li);
    ArrayAdapter<String> adap = new ArrayAdapter<>(
            this,
            android.R.layout.simple_list_item_1,
            words
    );
    list.setAdapter(adap);
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            String de = defn.get(i);
            Toast.makeText(getApplicationContext(),de,Toast.LENGTH_SHORT).show();
        }
    });
}


public void add(View view) {
    EditText txtw = (EditText) findViewById(R.id.t1);
    String ndef = txtw.getText().toString();
    defn.add(ndef);
    EditText txtd = (EditText) findViewById(R.id.t2);
    String nword = txtd.getText().toString();
    words.add(nword);
    run();
}

public void reset1(View view) {
    EditText t1 = (EditText) findViewById(R.id.t1);
    t1.setText("");

}
public void reset2(View view) {
    EditText t2 = (EditText) findViewById(R.id.t2);
    t2.setText("");

}
}

使用数组列表,以便您可以在运行时添加项目。如上更改代码。 您不能将项目添加到简单数组中,因为它的大小在编译时是固定的,您不能在运行时将新项目添加到数组中。