Martin
Martin

Reputation: 4816

getView not getting called?

I have an adapter that extends simplecursoradapter. The new view is supposed to take a cursor from a database along with an image, populate a list with a couple of checkboxes. For some reason I can't seem to see, my getView is not even being called. I have a breakpoint inside getView and it never gets there and the list just shows up empty. Can anyone take a look thru and see what I've done wrong

public class TakeStudentAttendance extends ListActivity {
private gradeBookDbAdapter mDbHelper;
private Long mRowId;
private TextView mNameText;
private String classname;
private Boolean new_attendance = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Cursor stud;

    mDbHelper = new gradeBookDbAdapter(this);
    mDbHelper.open();
    mRowId = (savedInstanceState == null) ? null
            : (Long) savedInstanceState
                    .getSerializable(gradeBookDbAdapter.KEY_ROWID);
    if (mRowId == null) {
        Bundle extras = getIntent().getExtras();
        mRowId = extras != null ? extras
                .getLong(gradeBookDbAdapter.KEY_ROWID) : null;
    }
    // pull in class data
    stud = mDbHelper.fetchClass(mRowId);
    startManagingCursor(stud);

    classname = stud.getString(
                stud.getColumnIndexOrThrow(gradeBookDbAdapter.KEY_CLASSNAME));
    String title = "Attendance for " + classname;
    setTitle(title);

    setContentView(R.layout.attendance_list);
    Button doneButton = (Button) findViewById(R.id.Done);
    doneButton.setOnClickListener(mAttendanceActivity);

    // check previous attendance date
    String prevdate = stud.getString(
            stud.getColumnIndexOrThrow(gradeBookDbAdapter.KEY_PREVDATE));

    stud = mDbHelper.fetchAttendanceByClass(mRowId);  // this query yields _id, name, 
                                                      // attend, late, dtime

    if (mDbHelper.getClassDate() == prevdate){
        // previous date is the same, so we're doing attendance again: retain values
        new_attendance = false;
    }
    else {
        // dates are different, so we're starting from scratch and all students are
        // absent until counted present. I just need names and will populate attendance
        new_attendance = true;          
        // upon attendance start-up, NO ONE is present. Set all entries in DB to not present (0)
        setNoAttend(stud, mRowId);
        // reset cursor position
        stud.moveToFirst();
    }



    // Create an array to specify the fields we want to display in the list 
    String[] from = new String[]{gradeBookDbAdapter.KEY_NAME,
                                 gradeBookDbAdapter.KEY_ROWID,
                                 gradeBookDbAdapter.KEY_ATTEND,
                                 gradeBookDbAdapter.KEY_LATE,
                                 gradeBookDbAdapter.KEY_DTIME};

    // and an array of the fields we want to bind those fields to (in this case just text1)
    int[] to = new int[]{R.id.stuname, 
                         R.id.stuIndex,
                         R.id.attend,
                         R.id.late,
                         R.id.stuIndex};

    // Now create a simple cursor adapter and set it to display
    // mRowId holds the class index.
    MyDataAdapter studs = 
       new MyDataAdapter(this, R.layout.show_attendance, stud, from, to, mRowId, new_attendance);
    setListAdapter(studs);
} 

Here's my adapter code:

public class MyDataAdapter extends SimpleCursorAdapter {
private Cursor c;
private Context context;
private Long classnum;
private gradeBookDbAdapter mDbHelper;
private Boolean newValues;
private ArrayList<String> list = new ArrayList<String>();
private ArrayList<Boolean> itemCheckedHere = new ArrayList<Boolean>();
private ArrayList<Boolean> itemCheckedLate = new ArrayList<Boolean>();
private ArrayList<Integer> itemCheckedIdx = new ArrayList<Integer>();
int idxCol;
int idx;

// itemChecked will store the position of the checked items.

public MyDataAdapter(Context context, int layout, Cursor c, String[] from,
        int[] to, Long mRowId, Boolean new_attendance) {
    super(context, layout, c, from, to);
    this.c = c;
    this.context = context;
    mDbHelper = new gradeBookDbAdapter(context);
    mDbHelper.open();
    classnum = mRowId;
    newValues = new_attendance;
    c.moveToFirst();
    for (int i = 0; i < c.getCount(); i++) {
        itemCheckedHere.add(i, false); // initializes all items value with false
        itemCheckedLate.add(i, false); // initializes all items value with false
    }
}

public View getView(final int pos, View inView, ViewGroup parent) {
    File file;
    ImageView studentPhoto;

    if (inView == null) {
               LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inView = inflater.inflate(R.layout.show_attendance, null);
    }

    // set up name field        
    final TextView studentName = (TextView) inView.findViewById(R.id.stuname); 
    final TextView studentIndex = (TextView) inView.findViewById(R.id.stuIndex);
        if (studentName != null)
        {
            c.moveToPosition(pos);
            int index = c.getColumnIndex(gradeBookDbAdapter.KEY_NAME);
            String name = c.getString(index);
            studentName.setText(name);

            index = c.getColumnIndex(gradeBookDbAdapter.KEY_STUDENT);
            String Index = c.getString(index);
            studentIndex.setText(Index);


             // set up photo icon

            file = new File(Environment.getExternalStorageDirectory () + 
                      "/gradeBook/" + name + ".jpg");
            studentPhoto = (ImageView) inView.findViewById(R.id.icon);

            if (file.exists()) {
                String fileName = file.getAbsolutePath();
                BitmapFactory.Options opts = new BitmapFactory.Options();
                Bitmap bm;

                bm = BitmapFactory.decodeFile(fileName, opts);
                studentPhoto.setImageBitmap(bm);
            } 
            else {
                // use icon image
                studentPhoto.setImageResource(R.drawable.person_icon);
            }

    } 
    final CheckBox cBoxH = (CheckBox) inView.findViewById(R.id.attend);
    final CheckBox cBoxL = (CheckBox) inView.findViewById(R.id.late);


    cBoxH.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {

            CheckBox cb = (CheckBox) v.findViewById(R.id.attend);

            if (cb.isChecked()) {
                itemCheckedHere.set(pos, true); 
                int Index = new Integer(studentIndex.getText().toString());
                mDbHelper.insertAttend(Index, classnum,  1 ); 
            } else if (!cb.isChecked()) {
                itemCheckedHere.set(pos, false);
                int Index = new Integer(studentIndex.getText().toString());
                mDbHelper.deleteAttend(Index, classnum );
            }
        }
    });
    cBoxL.setOnClickListener(new OnClickListener() {

       public void onClick(View v) {
            CheckBox cb = (CheckBox) v.findViewById(R.id.late);

            if (cb.isChecked()) {
               itemCheckedLate.set(pos, true);
               // do some operations here
            } else if (!cb.isChecked()) {
               itemCheckedLate.set(pos, false);
               // do some operations here
            }
        }
    });
    cBoxH.setChecked(itemCheckedHere.get(pos)); // this will Check or Uncheck the
    cBoxL.setChecked(itemCheckedLate.get(pos)); // this will Check or Uncheck the
    // CheckBox in ListView
    // according to their original
    // position and CheckBox never
    // loss his State when you
    // Scroll the List Items.
    return inView;
}

}

Upvotes: 3

Views: 8967

Answers (3)

Andrii Mishchenko
Andrii Mishchenko

Reputation: 2694

There can be another reason, why getView is never called. In my case I had two elements in LinearLayout - TextView and ListView. The attribute layout_height of TextView was set to fill_parent and ListView element was out of screen bounds because of this. As getView method is called only when ListView item becomes visible to user, so it has never been called. Changing layout_height property to wrap_content solved this problem.

Upvotes: 12

linitbuff
linitbuff

Reputation: 359

Another thing is to make sure you have called setContentView() with the appropriate argument.

Upvotes: 0

Gregory
Gregory

Reputation: 4424

This got answered in the comment, but it might as well get a real answer ^^

getCount() is actually returning 0, so the problem is in the query coming back empty, and not in the adapter.

Upvotes: 22

Related Questions