Android:尝试使用listView访问唯一的ID

时间:2015-04-03 02:33:47

标签: android sqlite

我的listView出现问题,并从中正确检索项目。 我的应用程序是一个管理员应用程序,允许教师为特定学生添加课程笔记。我的方案如下:

当教师向列表中添加新课程备注时,它会自动为其提供唯一ID

所以学生1(身份1)有带有ID的课程笔记:1,3,4,5和6

学生2(身份2)有带有ID的课程笔记:2,7,8和9

学生1的列表视图为:1,2,3,4,5

学生2的列表视图为:1,2,3,4,5

因此,当学生1访问注释1时,查询如下:select * from table_lessons其中lessonID = 1且StudentID = 1

注2:从table_lessons中选择*,其中lessonID = 2且StudentID = 1

注3:从table_lessons中选择*,其中lessonID = 3且StudentID = 1

依旧......

但是你看到学生1没有课程记录'2' - 所以程序崩溃了

我认为listView的位置正在抛弃该程序......

这是我的lessonNotesList类:(更新)

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lesson_notes_list);
    Button backToMain = (Button)findViewById(R.id.backToMain);
    backToMain.setOnClickListener(this);
    Bundle extras = getIntent().getExtras();
    dyslexiaDb = new DBHelper(this);
    ArrayList array_list = dyslexiaDb.getAllStudents();
    //Creating an ArrayList of contacts data
    //ArrayAdapter arrayAdapter = new ArrayAdapter(this,R.layout.list_layout, array_list);
    LessonAdapter adapter = new LessonAdapter(array_list);
    ListView listView = new ListView(this);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
            // the id parameter returns the adapter's getItemId method
            //intent.putExtra("lesson_id", id);
        }
    }); 
}

LessonAdapter类:

public class LessonAdapter extends BaseAdapter{
    private ArrayList<LessonNotesData> lessonNotes;

    public LessonAdapter(ArrayList<LessonNotesData> lessonNotes) {
        this.lessonNotes = lessonNotes;
    }
    @Override
    public int getCount(){
        // get the number of lessons stored in the array
        return lessonNotes.size();
    }
    @Override
    public LessonNotesData getItem(int item){
        // return the lesson object
        return lessonNotes.get(item);
    }
    @Override
    public long getItemId(int item){
        // return the lessonNotes id
        return getItem(item).getLessonID();
    }
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        // inflate the layout item you want to use
        view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.activity_lesson_notes_list, viewGroup, false);
        //((TextView)     view.findViewById(R.id.listViewMain)).setText(getItem(i).getDate());
        return view;
    }
}

activity_lesson_notes_list.xml

<Button
    android:id="@+id/backToMain"
    android:layout_width="185dp"
    android:layout_height="wrap_content"
    android:text="@string/backBtn"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />

<Button
    android:id="@+id/AddNew"
    android:layout_width="188dp"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"    
    android:layout_alignParentTop="true"
    android:text="Add New" />

<ListView
    android:id="@+id/listViewMain"
    android:layout_width="match_parent"
    android:layout_height="685dp"
    android:layout_below="@+id/AddNew"
    android:layout_alignRight="@+id/backToMain"
    android:layout_alignEnd="@+id/backToMain">
</ListView>

由于

2 个答案:

答案 0 :(得分:1)

我假设您正在为课程使用对象,因此我创建了一个模拟课程,将课程对象作为示例。以下是一些代码片段,可以让您走上正确的轨道。如果您有更多问题,请随时提出。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    LessonAdapter adapter = new LessonAdapter(getStudentsLessons());
    ListView listView = new ListView(this);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
            // the id parameter returns the adapter's getItemId method
            intent.putExtra("lesson_id", id);
        }
    });

}

public class LessonAdapter extends BaseAdapter {

    private ArrayList<Lesson> lessons;

    public LessonAdapter(ArrayList<Lesson> lessons) {
        this.lessons = lessons;
    }

    @Override
    public int getCount() {
        // get the number of lessons
        return lessons.size();
    }

    @Override
    public Lesson getItem(int i) {
        // return the lesson object
        return lessons.get(i);
    }

    @Override
    public long getItemId(int i) {
        // return the lesson's id
        return getItem(i).getId();
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        // inflate the layout item you want to use
        // below is using the build in simple list item, but you can sub in a custom one if you want
        view = LayoutInflater.from(viewGroup.getContext()).inflate(android.R.layout.simple_list_item_1, viewGroup, false);
        ((TextView) view.findViewById(android.R.id.text1)).setText(getItem(i).getName());
        return view;
    }
}

public class Lesson {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

答案 1 :(得分:0)

您的问题不在于ListView,而在dyslexiaDb.getAllLessonNotes(studentID)显示该课程尚未分配给学生2的情况下,1会返回getAllLessonNotes()

理想情况下,SELECT * FROM table_lessons WHERE StudentID = 1 中的SQL应该像

List

会返回Lesson个自定义ArrayAdapter个对象,如果您恰当地覆盖Lesson#toString(),这些对象仍然可以与普通 select * from table_lessons where lessonID = 2 and StudentID = 1 一起使用。

这也有助于避免进行第二次数据库调用以使用

检索所有课程详细信息
Lesson

因为您可以通过Intent直接将{{1}}对象传递到您的详细活动。