Нужна помощь в передаче переменных из элемента списка в другое действие

Мне нужно какое-то объяснение того, как я могу передать любое значение столбца базы данных, которое я хочу, из базы данных для элемента списка.

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

Вот мой код и еще несколько деталей, которые помогут вам помочь мне:

День.java:

package com.dd.gfit;

public class Day {

    private long id;
    private long id_routine;
    private String name;
    private String day;

    public long getId() { return id; }  
    public long getIdRoutine() { return id_routine; }   
    public String getName() { return name; }    
    public String getDay() { return day; }

    public void setId(long id) { this.id = id; }    
    public void setIdRoutine(long id_routine) { this.id_routine = id_routine; } 
    public void setName(String name) { this.name = name; }  
    public void setDay(String day) { this.day = day; }

} 

Здесь значения хранятся и извлекаются. Я понимаю.

DaysDataSource.java:

package com.dd.gfit;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class DaysDataSource {

    private SQLiteDatabase database;
    private MySQLiteHelper dbHelper;
    private String[] allColumns = { MySQLiteHelper.COLUMN_ID, MySQLiteHelper.COLUMN_ID_ROUTINE, MySQLiteHelper.COLUMN_NAME, MySQLiteHelper.COLUMN_DAY };

    public DaysDataSource(Context context) {
        dbHelper = new MySQLiteHelper(context);
    }

    public void open() throws SQLException {
        database = dbHelper.getWritableDatabase();
    }

    public void close() {
        dbHelper.close();
    }

    public Cursor fetchAllDays(long id) {     
        Cursor cursor = database.query(MySQLiteHelper.TABLE_DAYS, allColumns, MySQLiteHelper.COLUMN_ID_ROUTINE + " = " + id, null, null, null, null);
        if (cursor != null) { cursor.moveToFirst(); }
        return cursor;
    }

} 

Это источник данных, из которого я могу извлечь все дни и значения их столбцов в курсор, который будет использоваться в простом курсороадаптере для применения к списку. Я тоже это понимаю.

DaysActivity.java:

package com.dd.gfit;

import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.widget.SimpleCursorAdapter;

public class DaysActivity extends ListActivity {

    private DaysDataSource datasource;
    private SimpleCursorAdapter dataAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_days);

        datasource = new DaysDataSource(this);
        datasource.open();

        Cursor cursor = datasource.fetchAllDays(routineDataID);
        String[] columns = new String[] { MySQLiteHelper.COLUMN_NAME, MySQLiteHelper.COLUMN_DAY };
        int[] to = new int[] { R.id.listitem_day_name, R.id.listitem_day_day };
        dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day, cursor, columns, to, 0);
        setListAdapter(dataAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {     
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_days, menu);
        return true;        
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long thisID)
    {
        Day day = (Day)getListAdapter().getItem(position);
        long id = day.getId();

        Intent startDayActivity = new Intent(this, DayActivity.class);
        startDayActivity.putExtra("routineDataID", id);
        this.startActivity(startDayActivity);
    }

} 

Это та часть, которую я не понимаю. Прежде всего, список идеально подходит для того, что я хочу. Функция onListItemClick() вызывает сбой приложения при его запуске (когда я нажимаю элемент списка). id, кажется, приближается к нулю или что-то в этом роде? Как будто ему никогда не присваивалось значение для элемента списка.

Мне нужно знать, что мне здесь не хватает. Мне нужен кто-то, кто поможет мне и скажет мне, что мне нужно добавить в мой код и куда это добавить, чтобы я мог лучше понять, как это делать правильно в будущем.

Я предполагаю, что мне нужно применить значения для day ПЕРЕД попыткой использовать функцию getId()? Любая помощь будет здорово.

РЕДАКТИРОВАТЬ:

У меня есть кнопка внутри списка, я также хочу иметь возможность захватить id при нажатии этой кнопки.

Вот код, использующий адаптер массива, который я хотел бы преобразовать в простой курсороадаптер:

public void onClick(View view) {    
    @SuppressWarnings("unchecked")
    ArrayAdapter<Day> adapter = (ArrayAdapter<Day>)getListAdapter();
    ListView lv = getListView();
    int position = lv.getPositionForView(view);
    Day day = (Day) getListAdapter().getItem(position);
    long id = day.getId();
}

РЕДАКТИРОВАТЬ СНОВА:

Догадаться. Вот код:

    ListView l = getListView();
    int position = l.getPositionForView(view);

    Cursor cursor = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
    cursor.moveToPosition(position);
    long id = cursor.getLong(cursor.getColumnIndex(MySQLiteHelper.COLUMN_ID));
    String name = cursor.getString(cursor.getColumnIndex(MySQLiteHelper.COLUMN_NAME));

person scarhand    schedule 25.12.2012    source источник


Ответы (2)


Измените свой код onListItemClick как для получения выбранного значения от курсора:

@Override
    protected void onListItemClick(ListView l, View v, int position, long thisID)
    {
      Cursor cursor = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
      cursor.moveToPosition(position);
      long id = cursor.getLong(cursor.getColumnIndex("YOUR_COLUMN_NAME_HERE"));

      Intent startDayActivity = new Intent(DaysActivity.this, DayActivity.class);
      startDayActivity.putExtra("routineDataID", id);
      startActivity(startDayActivity);
    }
person ρяσѕρєя K    schedule 25.12.2012
comment
Спасибо еще раз! У меня есть еще одна вещь, чтобы спросить вас. У меня есть кнопка внутри списка. Я хочу получить id для элемента списка при нажатии кнопки. Я обновляю свой код сейчас. Если бы вы могли взглянуть, я был бы очень признателен. - person scarhand; 25.12.2012
comment
убедитесь, что вы получаете правильное значение в позиции при нажатии кнопки - person ρяσѕρєя K; 25.12.2012

Использовать этот:

Строка selectedData = (String) (l.getItemAtPosition (позиция));

person Ricky Khatri    schedule 25.12.2012