Java Error ArrayList

So, I need to write an application with ListView. It should work: you click on an element, and it directs you to the second activity. There must be information from JSON. I did it with okHttp. I am not far from my fate, but here is the mistake. solvable. The following problem: when clicking on the ListView element there is no reaction.

MainActivity.java (part of the problem code):

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

And the DetailsActivity.java code:

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

And I think it will be useful to give you 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; 
    }
}
+4
source share
4 answers

java.lang.IndexOutOfBoundsException , , 1, 0 (: 1, : 0)

Java :

IndexOutOfBoundsException extends RuntimeException

, - (, , ) .

. , te, , , , .

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

    //...
+1

datas = new ArrayList<MyDataModel>();

ArrayList 0

- :

MyDataModel data = datas.get(position);

, :

java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
+1

private List<MyDataModel> datas = new ArrayList<>();. , datas = new ArrayList<MyDataModel>(); on onItemClick, , , .

Data must be added to ArrayList data, for example, datas.add(new MyDataModel());

You must pass the same ArratList to the ArrayAdapter.

0
source

Please use checks to avoid arrayindex exceptions

datas = new ArrayList<MyDataModel>();
if(datas.size()>0)
{
MyDataModel data = datas.get(position);
}
0
source

Source: https://habr.com/ru/post/1658196/