Получение идентификатора элемента из базы данных при нажатии на элемент из ListView - PullRequest
0 голосов
/ 13 июня 2018

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

My MainActivity - для отображения данных в виде списка из моей базы данных

public class test extends AppCompatActivity {
ImageButton btnadd;
SQLiteDatabase sqLiteDatabase;
DatabaseOpenHelper databaseHelper;
TextView yekuntxt;
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        this.listView = (ListView) findViewById(R.id.listView);
        DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this);
        databaseAccess.open();
        final List<String> costumer_data = databaseAccess.getData();
        databaseAccess.close();
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, costumer_data);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
                {
                   View view = getLayoutInflater().inflate(R.layout.arrayadapter,null);

                    String Id = listView.getItemAtPosition(position).toString();
                    Intent i =new Intent(test.this, activity_daxilet.class);
                    i.putExtra("ID", position);
                    startActivity(i);

                }

            }
        });

Доступ к моей базе данных

public class DatabaseAccess {
private SQLiteOpenHelper openHelper;
private SQLiteDatabase database;
private static DatabaseAccess instance;

private DatabaseAccess(Context context) {
    this.openHelper = new DatabaseOpenHelper(context);
}

public static DatabaseAccess getInstance(Context context) {
    if (instance == null) {
        instance = new DatabaseAccess(context);
    }
    return instance;
}
public void open() {
    this.database = openHelper.getWritableDatabase();
}
public void close() {
    if (database != null) {
        this.database.close();
    }
}

public List<String> getData() {
    List<String> list = new ArrayList<>();
    Cursor cursor = database.rawQuery("SELECT AD,SOYAD FROM costumer_data", null);

    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {

        list.add(cursor.getString(0)+ " " + cursor.getString(1));

        cursor.moveToNext();
    }
    cursor.close();
    return list;

Мое второе занятие

public class activity_daxilet extends AppCompatActivity {
TextView ad,medaxil,mexaric;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_daxilet);



    Bundle bundle = getIntent().getExtras();
    if (bundle !=null){
        ad.setText("@position");
    }

}

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

В одну сторону:

  • мы можем получить идентификатор, когда получим costumer_data из базы данных ( getData ), например: SELECT ID, ...
  • передать его во второй вид в качестве дополнительного вместо установленной в данный момент позиции

Удачи

0 голосов
/ 14 июня 2018

Использование позиции третьего параметра для ListAdapter не будет равно id, особенно если строки были удалены.

Самый простой способ - использовать адаптер курсора, в этом случае идентификатор будет 4-м параметром, передаваемым в onItemClickListener.SimpleCursorAdapter вполне может быть достаточно.

Чтобы перейти к использованию SimpleCursorAdapter, выполните следующие действия: -

  1. Добавьте метод в свой DatabaseAccess.java для возврата курсора (или замените метод getData) например

: -

public Cursor getDataAsCursor() {
    String[] columns = new String[]{"AD","SOYAD","rowid AS " + BaseColumns._ID};
    return this.database.query(
            "costumer_data",
            columns,
            null,null,null,null,null
    );
}
  • Обратите внимание, что не ясно, если вы определили столбец id или как он называется.Для адаптера Cursor требуется столбец с именами _id , (BaseColumns._ID разрешает до _id) , следовательно, использование выше.
    • Был использован метод удобства запроса, а не метод rawQuery, хотя он может показаться более сложным, но рекомендуется по сравнению с rawQuery.

.

ДЛЯ ТЕСТИРОВАНИЯ добавить метод в DatabaseAccess.java, позволяющий добавлять данные

: -

public long addRow(String ad, String soyad) {
    ContentValues cv = new ContentValues();
    cv.put("AD",ad);
    cv.put("SOYAD",soyad);
    return this.database.insert("costumer_data",null,cv);
}
  • Обратите внимание, что это может не потребоваться, если у вас уже естьданные или эквивалентный метод

.

Изменить MainActivity

: -

public class test extends AppCompatActivity {
    ImageButton btnadd; //??
    SQLiteDatabase sqLiteDatabase; // NOT NEEDED
    DatabaseOpenHelper databaseHelper; // NOT NEEDED
    TextView yekuntxt; //??
    private ListView listView;
    SimpleCursorAdapter adapter; // ADDED
    Cursor cursor; // ADDED
    DatabaseAccess databaseAccess; // ADDED

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        this.listView = (ListView) findViewById(R.id.listView);
        databaseAccess = DatabaseAccess.getInstance(this); // Changed to use class variable
        databaseAccess.open();
        addSomeData(); // <<<< ADDED for testing (adds some data to the table (4 rows as below))
        cursor = databaseAccess.getDataAsCursor(); // ADDED
        //final List<String> costumer_data = databaseAccess.getData(); // REMOVED
        //databaseAccess.close(); // <<<<<<<<<< MUST NOT CLOSE DB WHEN using Cursor (see onDestory method)
        adapter = new SimpleCursorAdapter(
                this,
                android.R.layout.simple_list_item_2, // (show AD and SOYAD seprately)
                cursor, //<<<< The cursor used for the source data of the ListView
                new String[]{"AD","SOYAD"}, // The columns FROM which to get the data
                new int[]{android.R.id.text1, // The respective views TO which the data is placed
                        android.R.id.text2},
                0
        );
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
                {
                    Intent i = new Intent(test.this, activity_daxilet.class);
                    i.putExtra("ID", id);
                    startActivity(i);
                }
            }
        });
    }

    //<<<<<<<<<< Added to close the Cursor  and then database when done with it
    @Override
    protected void onDestroy() {
        cursor.close();
        databaseAccess.close();
        super.onDestroy();
    }

    //<<<<<<<<<< Added to load some data for testing
    private void addSomeData() {
        databaseAccess.addRow("TestAD1","TestSOYAD1");
        databaseAccess.addRow("TestAD2","TestSOYAD2");
        databaseAccess.addRow("TestAD3","TestSOYAD3");
        databaseAccess.addRow("TestAD4","TestSOYAD4");
    }
}
  • Комментарии должны объяснять внесенные изменения

.

Измените файл activity_daxilet.java, чтобы получить переданный идентификатор

: -

public class activity_daxilet extends AppCompatActivity {

    TextView showpassedid;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_daxilet);
        showpassedid = (TextView) this.findViewById(R.id.showpassedid);

        long passedid = this.getIntent().getLongExtra("ID",-1);
        showpassedid.setText("Id Passed was " + String.valueOf(passedid));
    }
}
Измените файл activity_daxilet.xml, добавив в него текстовое представление showpassedid

, например: -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activity_daxilet">
    <TextView
        android:id="@+id/showpassedid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

Результаты

При первом запуске: -

enter image description here

Нажмите на элемент (3): -

enter image description here

0 голосов
/ 13 июня 2018

Вы отправляете позицию id в listview, и я думаю, что вы хотите передать второй активности: id само.

Поэтому измените эту строку:

i.putExtra("ID", position);

с:

i.putExtra("ID", Id);

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

Bundle bundle = getIntent().getExtras();
if (bundle !=null){
    ad.setText("@position");
}

это (также вам нужно найти свойtextview by id):

ad = findViewById(R.id.textviewid);
Intent intent = getIntent();
String Id = intent.getExtras().getString("ID");
ad.setText(Id);

вам нужно добавить идентификатор к вашему textview, если вы этого не сделали!добавьте этот тег к textview в файле xml:

android:id="@+id/textviewid"

, и это должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...