ошибка передачи другому действию после просмотра списка. Обработчик Uncaught: основной выход потока из-за необработанного исключения. - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть проблема ...

02-20 02:57:09.854: E/AndroidRuntime(12431): Uncaught handler: thread main exiting due to uncaught exception"

... позже ...

02-20 02:57:09.864: E/AndroidRuntime(12431): java.lang.ClassCastException: java.util.ArrayList

... в ListView, заполненном SQLite, listView работает нормально, но позже, когда я пытаюсь использовать onListItemClick, чтобы получить параметры элемента в выбранном представлении списка и показать его в другом макете, программа останавливается и DDMS говорит, что «обработчик Uncaught: выход из основного потока из-за необработанного исключения» позже говорит «java.lang.ClassCastException: java.util.ArrayList» в ListView «возможно, я плохо обработал свой адаптер Arraylist?

Это мой основной класс:

public class lay_main extends ListActivity 
    {
    public ListView list;
public DBHelper myAdap;
protected SQLiteDatabase db;
public Cursor cursor;
DBHelper Context;
DBHelper ArrayList;

//adapter cAdapter class
protected ListAdapter adapter;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.lay_main);  

    collectXML();
    setupDataBase();
    setupAdapter();

}      
private void collectXML() 
{
     list = (ListView)findViewById(android.R.id.list);  

}

public void setupDataBase() {
    myAdap = new DBHelper(getApplicationContext());
    myAdap.insertCourses();             
}

public void setupAdapter()
{
if(myAdap.getCourses()!=null)
    {
    cAdapter adapter = new  cAdapter(this, R.layout.list_courses, myAdap.getCourses());
    list.setAdapter(adapter);
    }
}
public void onListItemClick(ListView parent, View view, int position, long id) 
 {
        super.onListItemClick(parent, view, position, id);
        Intent intent = new Intent(this, CourseDetails.class);
        Cursor cursor = (Cursor) myAdap.getItem(position);
        intent.putExtra("COURSE_ID", cursor.getInt(cursor.getColumnIndex("title")));
        startActivity(intent);  
 }
}

мой класс CourseDetails для получения и отображения данных:

public class CourseDetails<BDHelper> extends Activity {
protected TextView tTitle;
protected TextView tInstructor;
protected TextView tLength;
protected TextView tRating;
protected TextView tTopic;
protected TextView tSubject;
protected TextView tDescription;

protected  int courseId;    
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.course_details);

    courseId = getIntent().getIntExtra("COURSE_ID", 0);
    SQLiteDatabase db = (new DBHelper(this)).getWritableDatabase();
    Cursor cursor = db.rawQuery("SELECT title, instructor, length, rating, topic, subject, description FROM courses",         
            new String[]{"" + courseId});


    if (cursor.getCount() == 1)
    {
            cursor.moveToFirst();

            tTitle = (TextView) findViewById(R.id.tTitle);
            tTitle.setText(cursor.getString(cursor.getColumnIndex("title")));

            tInstructor = (TextView) findViewById(R.id.tInstructor);
            tInstructor.setText(cursor.getString(cursor.getColumnIndex("instructor")));

            tLength = (TextView) findViewById(R.id.tLength);
            tLength.setText(cursor.getString(cursor.getColumnIndex("length")));

            tRating = (TextView) findViewById(R.id.tRating);
            tRating.setText(cursor.getString(cursor.getColumnIndex("rating")));

            tTopic = (TextView) findViewById(R.id.tTopic);
            tTopic.setText(cursor.getString(cursor.getColumnIndex("topic")));

            tSubject = (TextView) findViewById(R.id.tSubject);
            tSubject.setText(cursor.getString(cursor.getColumnIndex("subject")));

            tDescription = (TextView) findViewById(R.id.tDescription);
            tDescription.setText(cursor.getString(cursor.getColumnIndex("description")));

    }


}}

Класс моего адаптера:

public class cAdapter extends ArrayAdapter {
Context context;
ArrayList<Courses> courses;

@SuppressWarnings("unchecked")
public cAdapter(Context context, int layout_id, ArrayList<Courses> Courses) {

    super(context, layout_id, Courses);
    this.context=context;
    this.courses=Courses;


}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View row = inflater.inflate(R.layout.list_courses, null);
    try{
        //components
        TextView txt_title=(TextView)row.findViewById(R.id.txt_title);
        TextView txt_instructor=(TextView)row.findViewById(R.id.txt_instructor);
        TextView txt_length=(TextView)row.findViewById(R.id.txt_length);
        TextView txt_rating=(TextView)row.findViewById(R.id.txt_rating);
        TextView txt_topic=(TextView)row.findViewById(R.id.txt_topic);

        //asign values
        txt_title.setText(courses.get(position).title);
        txt_instructor.setText(courses.get(position).instructor);
        txt_length.setText(courses.get(position).length);
        txt_rating.setText(courses.get(position).rating);
        txt_topic.setText(courses.get(position).topic);

    }catch(Exception ex){}      
    return row;
}
}

не то, что я делаю неправильно, действительно буду признателен за вашу помощь.

1 Ответ

1 голос
/ 20 февраля 2012

Переопределить метод getItem адаптера и вернуть объект Cources из getItem,

Override
public Courses getItem(int position)
{
   return courses.get(positon);
}

и в методе SetupAdapter:

public void setupAdapter()
{
if(myAdap.getCourses()!=null)
    {
    adapter = new  cAdapter(this, R.layout.list_courses, myAdap.getCourses());
    list.setAdapter(adapter);
    }
}

и изменить на itemClick следующим образом:

public void onListItemClick(ListView parent, View view, int position, long id) 
 {
        super.onListItemClick(parent, view, position, id);
        Intent intent = new Intent(this, CourseDetails.class);
        Courses course= (Courses) adapter.getItem(position);
        intent.putExtra("COURSE_ID", course.title));
        startActivity(intent);  
 }
...