Android - принудительно закрыть, если я нажму на элемент в ListView - PullRequest
1 голос
/ 27 ноября 2011

Мне нужна ваша помощь, чтобы исправить мой код.

Мое намерение состоит в том, чтобы, если я щелкну по элементу в ListView, это приведет меня к намерению action_view.

Проблема в том, что я получил принудительное закрытие, если щелкнул элемент в ListView.

Я думаю, что проблема в методе onItemClick. Можете ли вы дать лучший способ сделать это?

Вот мой код:

public class HotelList extends ListActivity{
hotelHelper dbHotelHelper;
protected Cursor cursor;
protected ListAdapter adapter;
ListView numberList;    

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

    numberList = (ListView)findViewById(android.R.id.list);
    numberList.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                long arg3) {
            // TODO Auto-generated method stub
                    String selectedItem = (String) getListAdapter().getItem(position);
                    String query = "SELECT lat, long FROM hoteltbl WHERE name = '" + selectedItem + "'";
                    SQLiteDatabase dbs = dbHotelHelper.getReadableDatabase();
                    Cursor result = dbs.rawQuery(query, null);
                    result.moveToFirst();

                    double lat = result.getDouble(result.getColumnIndex("lat"));
                    double longi = result.getDouble(result.getColumnIndex("long"));

                    Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?f=d&saddr=&daddr="+lat+","+longi));
                    startActivity(intent);

                }                   
            });     


    dbHotelHelper = new hotelHelper(this);
    try{
        dbHotelHelper.createDataBase();         
    }
    catch (Exception ioe){
        Log.e("err","Unable to create database");
    }        
    view();   


    }



private void view() {
    // TODO Auto-generated method stub
    SQLiteDatabase db = dbHotelHelper.getReadableDatabase();
    try{
        cursor = db.rawQuery("SELECT * FROM hoteltbl", null);
        adapter = new SimpleCursorAdapter(
                this, 
                android.R.layout.simple_list_item_1, 
                cursor, 
                new String[]{"name"}, 
                new int[] {android.R.id.text1}
                );
        numberList.setAdapter(adapter);     
    }
    catch (Exception e){
        Log.e("error",e.toString());
    }       
}

}

1 Ответ

0 голосов
/ 18 января 2017

Клик внутри предмета у вас есть много способов, как это может вызвать исключение, Исключение приведет к закрытию приложения ваш код не обрабатывается с исключениями

Я перечисляю причины, которые могут вызвать исключение, пожалуйста, проверьте следующее

String selectedItem = (String) getListAdapter().getItem(position);

здесь вы можете получить сообщение о типе разговора, вы конвертируете что-то, что не поддерживается String

SQLiteDatabase dbs = dbHotelHelper.getReadableDatabase();
Cursor result = dbs.rawQuery(query, null);
result.moveToFirst();
double lat = result.getDouble(result.getColumnIndex("lat"));
double longi = result.getDouble(result.getColumnIndex("long"));
  1. Если dbHotelHelper.getReadableDatabase возвращает ноль или dbHotelHelper ноль, в этом случае ваше приложение принудительно закроет
  2. В случае, если dbs.rawQuery вернет ноль, ваше приложение принудительно закроет
  3. если результат равен нулю, то вы можете вызвать moveToFirst, getDouble и getColumnIndex для нулевого объекта, в этом случае ваше приложение также принудительно закроет

Для вашей информации Конструктор SimpleCursorAdapter устарел на уровне API 11. Этот параметр не рекомендуется, так как он приводит к тому, что запросы курсора выполняются в потоке пользовательского интерфейса приложения и, таким образом, могут вызвать плохую отзывчивость или даже ошибки приложения не отвечает. В качестве альтернативы используйте LoaderManager с CursorLoader.

...