java - 数组列表 java 错误

标签 java android arraylist

因此,我必须使用 ListView 编写一个应用程序。它必须起作用:您正在单击项目,它会引导您进入第二个 Activity 。必须有来自 JSON 的信息。我是用 okHttp 做的。我离我的命运不远了,但这是一个错误。 已解决。 下一个问题:点击ListView item没有反应。

MainActivity.java(部分问题代码):

public class MainActivity extends AppCompatActivity {
private ListView listView;
private ArrayList<String> list = new ArrayList<>();
private ArrayAdapter<String> adapter;
private List<MyDataModel> datas = new ArrayList<>();

public class MyClickListener implements AdapterView.OnItemClickListener{
    List<MyDataModel> datas;

    public MyClickListener(List<MyDataModel> datas){
        this.datas = datas;
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id){
        Intent intent = new Intent(MainActivity.this, DetailsActivity.class);

        if(position < datas.size()){
            MyDataModel data = datas.get(position);
            intent.putExtra(Key.KEY_ID,data.getItemId());
            intent.putExtra(Key.KEY_ABOUT,data.getAbout());
            intent.putExtra(Key.KEY_ADDRESS,data.getAddress());
            intent.putExtra(Key.KEY_COMPANY,data.getCompany());
            intent.putExtra(Key.KEY_EMAIL,data.getEmail());
            intent.putExtra(Key.KEY_FIRST_NAME,data.getFirstName());
            intent.putExtra(Key.KEY_LAST_NAME,data.getLastName());
            intent.putExtra(Key.KEY_PHONE,data.getPhone());

        }
        datas.add(new MyDataModel());
    }

}

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    list = new ArrayList<String>();
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, list);

    listView = (ListView) findViewById(R.id.listView);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new MyClickListener(datas));

以及DetailsActivity.java的代码:

public class DetailsActivity extends AppCompatActivity{

    private TextView textViewId;
    private TextView textViewAbout;
    private TextView textViewAddress;
    private TextView textViewCompany;
    private TextView textViewEmail;
    private TextView textViewFirstName;
    private TextView textViewLastName;
    private TextView textViewPhone;

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

        textViewId = (TextView) findViewById(R.id.textViewId);
        textViewAbout = (TextView) findViewById(R.id.textViewAbout);
        textViewAddress = (TextView) findViewById(R.id.textViewAddress);
        textViewCompany = (TextView) findViewById(R.id.textViewCompany);
        textViewEmail = (TextView) findViewById(R.id.textViewEmail);
        textViewFirstName = (TextView) findViewById(R.id.textViewFirstName);
        textViewLastName = (TextView) findViewById(R.id.textViewLastName);
        textViewPhone = (TextView) findViewById(R.id.textViewPhone);

        Intent intent = getIntent();

        textViewId.setText(String.valueOf(intent.getIntExtra(Key.KEY_ID, 0)));
        textViewAbout.setText(intent.getStringExtra(Key.KEY_ABOUT));
        textViewAddress.setText(intent.getStringExtra(Key.KEY_ADDRESS));
        textViewCompany.setText(intent.getStringExtra(Key.KEY_COMPANY));
        textViewEmail.setText(intent.getStringExtra(Key.KEY_EMAIL));
        textViewFirstName.setText(intent.getStringExtra(Key.KEY_FIRST_NAME));
        textViewLastName.setText(intent.getStringExtra(Key.KEY_LAST_NAME));
        textViewPhone.setText(intent.getStringExtra(Key.KEY_PHONE));
    }
}

我认为给你 MyDataModel.java 会很有用:

public class MyDataModel {
    private String about;
    private String address;
    private String company;
    private String email;
    private String firstname;
    private String lastname;
    private String phone;
    private int itemId;
    private String photo;

    public String getAbout(){
        return about;
    }
    public void setAbout(String about){
        this.about = about;
    }

    public String getAddress(){
        return address;
    }
    public void setAddress(String address){
       this.address = address;
    }

    public String getEmail(){
        return email;
    }
    public void setEmail(String email){
        this.email = email;
    }

    public String getFirstName(){
        return firstname;
    }
    public void setFirstName(String firstname){
        this.firstname = firstname;
    }

    public String getCompany(){
        return company;
    }
    public void setCompany(String company){
        this.company = company;
    }

    public String getLastName(){
        return lastname;
    }
    public void setLastName(String lastname){
        this.lastname = lastname;
    }

    public String getPhone(){
        return phone;
    }
    public void setPhone(String phone){
        this.phone = phone;
    }

    public int getItemId(){
        return itemId;
    }
    public void setItemId(int itemId){
        this.itemId = itemId; 
    }

    public String getPhoto(){
        return photo;
    }
    public void setPhoto(String photo){
        this.photo = photo; 
    }
}

最佳答案

当你得到一个 java.lang.IndexOutOfBoundsException 意味着你正试图访问你的数据结构中一个不存在的索引,在这个例子中是索引 1,当总大小为 0 时(索引: 1, 大小: 0)

来自official Java documentation :

public class IndexOutOfBoundsException extends RuntimeException

Thrown to indicate that an index of some sort (such as to an array, to a string, or to a vector) is out of range.

建议:首先定义监听器,将列表引用传递给构造函数,这样当用户单击时,您可以检查它是否为空

public class MyClickListener implements AdapterView.OnItemClickListener{

List<MyDataModel> datas;

public MyClickListener(List<MyDataModel> datas)
{

    this.datas = datas;
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    Intent intent = new Intent(MainActivity.this, DetailsActivity.class);

    //--> this was a problem--> datas = new ArrayList<MyDataModel>();

    if (position < datas.size())
    {
        MyDataModel data = datas.get(position);
        intent.putExtra(Key.KEY_ID,data.getItemId());
        intent.putExtra(Key.KEY_ABOUT,data.getAbout());
        intent.putExtra(Key.KEY_ADDRESS,data.getAddress());
        intent.putExtra(Key.KEY_COMPANY,data.getCompany());
        intent.putExtra(Key.KEY_EMAIL,data.getEmail());
        intent.putExtra(Key.KEY_FIRST_NAME,data.getFirstName());
        intent.putExtra(Key.KEY_LAST_NAME,data.getLastName());
        intent.putExtra(Key.KEY_PHONE,data.getPhone());

        view.getContext().startActivity(intent);
    }
}

然后在你想要的地方设置监听器

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

    //...
    listView.setOnItemClickListener(new MyClickListener(datas));

    //...

关于java - 数组列表 java 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40129697/

相关文章:

android - 如何在 Edittext 通过禁用用户键盘获得焦点时打开/填充警报对话框

java - 带函数参数的参数化 Runnable

java - 构造更小的 ArrayList 的 ArrayList

java - 音频处理 - 数字分块和前向傅里叶变换?

java - 从样本列表中获取项目

java - SpringApplication.run 后不打印 Logback

Java如何知道谁在修改ArrayList?

java - 按特定规则对对象的 List<T> 进行排序?

java - 使用 jersey 客户端编写 POST 请求

java - android:在多个 TextView 上绘制连续的字符串