getView没有被调用?

时间:2011-07-09 08:12:47

标签: android

我有一个扩展simplecursoradapter的适配器。新视图应该从数据库中获取光标和图像,使用几个复选框填充列表。由于某些原因我似乎无法看到,我的getView甚至没有被调用。我在getView中有一个断点,它永远不会到达那里,列表只显示为空。 任何人都可以看看我做错了什么

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

这是我的适配器代码:

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

}

3 个答案:

答案 0 :(得分:22)

这在评论中得到了解答,但它也可能得到一个真正的答案^^

getCount()实际上返回0,因此问题在于查询返回空,而不是在适配器中。

答案 1 :(得分:12)

还有另一个原因,为什么永远不会调用getView。就我而言,我在LinearLayout - TextViewListView中有两个元素。由于此原因,layout_height的{​​{1}}属性设置为TextViewfill_parent元素超出了屏幕范围。仅当ListView项对用户可见时才调用getView方法,因此从未调用它。将ListView属性更改为layout_height可解决此问题。

答案 2 :(得分:0)

另一件事是确保使用适当的参数调用setContentView()。