LBJ33 LBJ33 - 3 months ago 5
Android Question

Arraylist populating Listview in separate class not working

I'm trying to add an item to arraylist/adapter on button click in my class

MyMaxes.java:

Date currentDate = new Date();
ArrayAdapter<Record> records = new ArrayAdapter<Record>(getApplicationContext(), R.layout.custom_record);
records.add(new Record(currentDate ,maxSquat, maxBench, maxDead, maxTotal));
records.notifyDataSetChanged();


And in my other class, MyProgress.java, I'm trying to assign that adapter to the listview:

ListView listViewRec = (ListView) findViewById(R.id.listViewRecord);
listViewRec.setAdapter(records);


The records is underlined and says "Expression Expected". I feel I need to set the textviews in my custom layout file in the adapter somehow so it knows which item to put in which textview.. am I suppose to have an adapter class?

here is my custom_record:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Date"
android:textSize="18sp"
android:id="@+id/txtDate"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Bench"
android:id="@+id/txtBench"
android:paddingRight="5dp"
android:textSize="18sp"
android:layout_gravity="center_horizontal"
android:layout_alignParentTop="true"
android:paddingLeft="5dp"
android:layout_toLeftOf="@+id/txtSquat"
android:layout_toStartOf="@+id/txtSquat"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Squat"
android:textSize="18sp"
android:paddingRight="5dp"
android:id="@+id/txtSquat"
android:layout_alignParentTop="true"
android:paddingLeft="5dp"
android:layout_toLeftOf="@+id/txtDead"
android:layout_toStartOf="@+id/txtDead"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Dead"
android:paddingRight="5dp"
android:textSize="18sp"
android:id="@+id/txtDead"
android:layout_alignParentTop="true"
android:paddingLeft="5dp"
android:layout_toLeftOf="@+id/txtTotal"
android:layout_toStartOf="@+id/txtTotal"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Total"
android:textSize="18sp"
android:paddingRight="5dp"
android:paddingLeft="5dp"
android:id="@+id/txtTotal"
android:layout_marginRight="34dp"
android:layout_marginEnd="34dp"

android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"/>
</RelativeLayout>


and my custom object:

public class Record {

private Integer squat, bench, dead;
private double total;
private Date dateTime;

public Record(Date date,int squat, int bench, int dead, double total) {
this.bench = bench;
this.dateTime = date;
this.dead = dead;
this.squat = squat;
this.total = total;
}

public Integer getSquat() {
return squat;
}

public void setSquat(Integer squat) {
this.squat = squat;
}

public Integer getBench() {
return bench;
}

public void setBench(Integer bench) {
this.bench = bench;
}

public Integer getDead() {
return dead;
}

public void setDead(Integer dead) {
this.dead = dead;
}

public Double getTotal() {
return total;
}

public void setTotal(Integer total) {
this.total = total;
}

public Date getDateTime() {
return dateTime;
}

public void setDateTime(Date dateTime) {
this.dateTime = dateTime;
}
}


Edit:: Verify example:::

main activity code:

public class MainActivity extends AppCompatActivity {

Button mButton;
Integer maxSquat = 1;
Integer maxBench = 1;
Integer maxDead = 1;
Double maxTotal = 3.0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton= (Button) findViewById(R.id.btnTest);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Date currentDate = new Date();
ArrayAdapter<Record> records = new ArrayAdapter<Record>(getApplicationContext(), R.layout.custom_record);
records.add(new Record(currentDate ,maxSquat, maxBench, maxDead, maxTotal));
records.notifyDataSetChanged();
}
});
}
}


listview.java:

public class listview extends MainActivity {

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

ListView listViewRec = (ListView) findViewById(R.id.listViewRecord);
listViewRec.setAdapter(records);
}
}


listview.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listViewRecord"/>




activitymain.xml:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.bestworkouts.myapplication.MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnTest"/>




I then have the record.java class from above, as well as the custom_record.xml from above. Oddly enough this one gives me a different error, it cannot resolve "records" when setting adapter, where in my app it says "Expression Expected" for records...

Answer

Why can't you have one view with a Button and a ListView that you add to?

Your first problem - you can't reference the local variable records from anywhere outside the click listener. This is a compilation error.

Second problem - you would be creating a brand new, empty adapter each time you clicked the button, then only adding one Record to it.


activitymain.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listViewRecord"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnTest"/>

</LinearLayout>

Let's call this RecordActivity because it displays and adds records to a ListView.

I would suggest using an AlertDialog to show a popup View when you click the button to get a Record object.

public class RecordActivity extends AppCompatActivity {

    Button mButton;
    ArrayAdapter<Record> mAdapter;
    ListView listViewRec;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton= (Button) findViewById(R.id.btnTest);
        mAdapter = new ArrayAdapter<Record>(getApplicationContext(), R.layout.custom_record);
        listViewRec = (ListView) findViewById(R.id.listViewRecord);
        listViewRec.setAdapter(mAdapter);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mAdapter.add(getRecord());
            }
        });
    }

    private Record getRecord() {
        Date currentDate = new Date();
        // TODO: Get your max values from somewhere
        int maxSquat = 1;  // TODO: From input field
        int maxBench = 1; // TODO: From input field
        int maxDead = 1; // TODO: From input field

        return new Record(currentDate ,maxSquat, maxBench, maxDead);
    }
}

Remove maxTotal from the parameters. You can calculate that inside the constructor of a Record.

public Record(Date date,int squat, int bench, int dead) {
    this.bench = bench;
    this.dateTime = date;
    this.dead = dead;
    this.squat = squat;
    this.total = bench + dead + squat;
}
Comments