Search code examples
javaandroidsqlitearraylistandroid-tablelayout

Dynamic TableLayout with TextView is empty even with values in ArrayList


I'm trying to create a dynamic TableLayout with data from database. I store the data in an ArrayList and use it to setText for the TextView. I used debug to check and the ArrayList had the correct number of values as in the database. It's not empty. But still the screen is blank. I tried to setTextColor for the TextView but it still was empty. The first 5 TextViews are for the heading. Later I use for loop for setting the text. I'm trying to do this in a Fragment btw.

Edit: I even checked the value of the bookingHistoryList.get(0). The value is correct. I can't display it!

Here's the code

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    sessionManager = new SessionManager(getActivity());
    databaseHelper = new DatabaseHelper(getActivity());
    bookingHistoryList = new ArrayList();
    view =  inflater.inflate(R.layout.fragment_preferences, container, false);
    tableLayout = (TableLayout)view.findViewById(R.id.hTableLayout);

    TableRow pickDate = new TableRow(getActivity());
    TextView pickDateTxt = new TextView(getActivity());
    pickDateTxt.setText("Pick up Date");
    pickDate.addView(pickDateTxt);

    TableRow pickTime = new TableRow(getActivity());
    TextView pickTimeTxt = new TextView(getActivity());
    pickTimeTxt.setText("Pick up Time");
    pickTime.addView(pickTimeTxt);

    TableRow pickUpLocation = new TableRow(getActivity());
    TextView pickUpLocationTxt = new TextView(getActivity());
    pickUpLocationTxt.setText("Pick up Location");
    pickUpLocation.addView(pickUpLocationTxt);

    TableRow destination = new TableRow(getActivity());
    TextView destinationTxt = new TextView(getActivity());
    destinationTxt.setText("Destination");
    destination.addView(destinationTxt);

    TableRow vehicleType = new TableRow(getActivity());
    TextView vehicleTypeTxt = new TextView(getActivity());
    vehicleTypeTxt.setText("Vehicle Type");
    vehicleType.addView(vehicleTypeTxt);
   // databaseHelper.delete();
    String getUserEmail = sessionManager.getUserEmail();
    bookingHistoryList = databaseHelper.getBookingHistory(sessionManager.getUserEmail());
    rowCount = DatabaseUtils.queryNumEntries(databaseHelper.getReadableDatabase(),"bookingDetails");

    n = (int) rowCount*5;
    for(int i = 0; i<n; i++) {
        TableRow tableRow = new TableRow(getActivity());
        TextView textView = new TextView(getActivity());
        textView.setText(bookingHistoryList.get(i).toString());
        textView.setTextColor(Color.BLACK);
        tableRow.addView(textView);
        tableLayout.addView(tableRow,new TableLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));

        TableRow tableRow1 = new TableRow(getActivity());
        TextView textView1 = new TextView(getActivity());
        textView1.setText(bookingHistoryList.get(i+1).toString());
        tableRow1.addView(textView1);
        tableLayout.addView(tableRow,new TableLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));

        TableRow tableRow2 = new TableRow(getActivity());
        TextView textView2 = new TextView(getActivity());
        textView2.setText(bookingHistoryList.get(i+2).toString());
        tableRow2.addView(textView2);
        tableLayout.addView(tableRow,new TableLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));

        TableRow tableRow3 = new TableRow(getActivity());
        TextView textView3 = new TextView(getActivity());
        textView2.setText(bookingHistoryList.get(i+3).toString());
        tableRow2.addView(textView3);
        tableLayout.addView(tableRow,new TableLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));

        TableRow tableRow4 = new TableRow(getActivity());
        TextView textView4 = new TextView(getActivity());
        textView2.setText(bookingHistoryList.get(i+4).toString());
        tableRow2.addView(textView4);
        tableLayout.addView(tableRow,new TableLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
        i += 4;
    }

    return view;
}

Here's the code to get from database. Its return value is not empty.

public ArrayList getBookingHistory(String email) {
    ArrayList bookingHistoryList = new ArrayList();
    String e = email;
    Cursor c = db.rawQuery("select * from bookingDetails where email = '"+ email + "'", null);
    int cou = c.getCount();
    c.moveToFirst();
    do {
        bookingHistoryList.add(c.getString(c.getColumnIndex("date")));
        bookingHistoryList.add(c.getString(c.getColumnIndex("time")));
        bookingHistoryList.add(c.getString(c.getColumnIndex("fromLocation")));
        bookingHistoryList.add(c.getString(c.getColumnIndex("destination")));
        bookingHistoryList.add(c.getString(c.getColumnIndex("vehicle")));
    } while (c.moveToNext());

    return bookingHistoryList;
}

Stacktrace:

java.lang.NullPointerException
    at com.prematixsofs.taxiapp.PreferencesFragment.onCreateView(PreferencesFragment.java:75)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:45)
    at android.os.Handler.handleCallback(Handler.java:800)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5391)

Layout:

    <?xml version="1.0" encoding="utf-8"?>
 <FrameLayout 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"

    tools:context="com.looper.loop.PreferencesFragment">

    <LinearLayout
        android:id="@+id/fragmentPreferencesLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">


        <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/ScrollView01"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TableLayout
                android:id="@+id/hBookingHistoryTable"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

            </TableLayout>


        </ScrollView>

    </LinearLayout>
  </FrameLayout>

Solution

  • Two things :

    One:

    Your TableLayout id is hBookingHistoryTable. But in code, you are using a different id.

    tableLayout = (TableLayout)view.findViewById(R.id.hTableLayout);
    

    Change it to,

    tableLayout = (TableLayout)view.findViewById(R.id.hBookingHistoryTable);
    

    Two:

    You are creating TableRows but not adding them to TableLayout. Add this line to all TableRows,

    tableLayout.addView(<table_row_name>, new TableLayout.LayoutParams(
                 LayoutParams.FILL_PARENT,
                 LayoutParams.WRAP_CONTENT));
    

    Correct steps for dynamically add rows to a TableView :

    TableLayout table = (TableLayout) findViewById(R.id.main_table);
    TableRow row = new TableRow(this);
    
    TextView item = new TextView(this);
    item.setId(200+count); 
    item.setText(date);
    
    row.addView(item);
    table.addView(row, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));