Реализация CursorAdapter для получения идентификаторов строк БД ListItems в ListView - PullRequest
0 голосов
/ 29 мая 2011

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

Вот в чем дело:

Я получил базу данных с несколькими таблицами и внешними ключами и так далее.,Я написал (протестированную и работающую) базу данных, включая расширение класса SQLiteHelper для правильной работы.DB-Class содержит множество методов для получения различных операций над этой БД, таких как: вставка, обновление, удаление, изменение и некоторые особые потребности ....

Моя проблема заключается в следующем: я написал методкоторый возвращает все данные, содержащие (все строки) в базе данных, которые я хочу представить в ListView.Возвращаемый объект - это обернутый ArrayList>.У меня все отлично работает с ListViewAdapter, но потом я пришел к своей проблеме, которая почти сводит меня с ума:

Пользователь должен щелкнуть по случайному элементу в этом конкретном списке (который содержит все строки из БД)и затем я хочу обновить эту конкретную строку в БД новыми данными, которые пользователь поместил в поле EditText.На самом деле довольно простая задача, но я думаю, что просто не понимаю, как использовать CursorAdapter.

Мои вопросы сейчас:

  1. Что должен вернуть мой DB-метод (или посмотретьа также) что CursorAdapter может с этим справиться ....
  2. Как мне реализовать Адаптер, чтобы он просто выполнял эту одну задачу (получая правильный rowID записи БД в списке)

Вот мой метод извлечения данных из БД

public ArrayList<ArrayList<Object>> getAll()
    {
        ArrayList<ArrayList<Object>> allRows = new ArrayList<ArrayList<Object>>();

        //Cursorobjekt haelt die Daten einer Zeile und dient dazu in diesen zu iterieren
        Cursor myCursor1,myCursor2,myCursor3;


        myCursor1 = db.query 
        (       "Faecher",
                new String[] { "id" , FACH_NAME, FACH_ART },                    
                null, null, null, null, null
        );
        // Den Pointer an die erste Stelle ruecken
        myCursor1.moveToFirst();


        myCursor2 = db.query
        (
                "Ort",
                new String[]{"id" , ORT_RAUM , ORT_GEBAEUDE},
                null,null,null,null,null,null
        );
        myCursor2.moveToFirst();



        myCursor3 = db.query
        (
                "Profs",
                new String[]{"id", PROFS_NAME, PROFS_SNAME, FKEY_GENDER_ID},
                null,null,null,null,null,null
        );
        myCursor3.moveToFirst();


        for(int i=0; i < myCursor1.getCount(); i++)
        {
            ArrayList<Object> row1 = new ArrayList<Object>();

            row1.add(myCursor1.getLong(0));
            row1.add(myCursor1.getString(1));
            row1.add(myCursor1.getString(2));
            row1.add(myCursor2.getLong(0));
            row1.add(myCursor2.getString(1));
            row1.add(myCursor2.getString(2));
            row1.add(myCursor3.getLong(0));
            row1.add(myCursor3.getString(1));
            row1.add(myCursor3.getString(2));
            row1.add(myCursor3.getLong(3));
            allRows.add(row1);

            myCursor1.moveToNext();
            myCursor2.moveToNext();
            myCursor3.moveToNext();
        }

        myCursor1.close();
        myCursor2.close();
        myCursor3.close();

        return allRows;
    }

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

public class SubjectListAdapter extends CursorAdapter
{
    private LayoutInflater myInflater;


    public SubjectListAdapter(Context context, Cursor c) 
    {
        super(context, c);

    }

    @Override
    public View newView(Context context, Cursor myCursor, ViewGroup parent) 
    {

        return null;
    }

    @Override
    public void bindView(View parent, Context context, Cursor myCursor) 
    {


    }

}

Я надеюсь, что кто-то может помочь мне решить мою проблему или дать подсказку, куда мне обратиться, чтобы это сработало.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2013

Вы должны создать один большой запрос из БД и получить один Курсор. Вы можете использовать даже обычный выбор SQL, как

String selectQuery = "SELECT  id, " FACH_NAME", "+ FACH_NAME ", " + FACH_ART .... +" FROM Faecher INNER JOIN ...."; 
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

чтобы получить требуемый курсор. Чем создать собственный CursorAdapter с установленным курсором

 public class ExampleCursorAdapter extends CursorAdapter {
                public ExampleCursorAdapter(Context context, Cursor c) {
                    super(context, c);
                }

@Override
            public void bindView(View view, Context context, Cursor cursor) {
                TextView something1 = (TextView)view.findViewById(R.id.something1);
                something1.setText(cusror.getString(0));
                        TextView something2 = (TextView)view.findViewById(R.id.something2);
                something1.setText(cusror.getString(1));
                        .......
                viev.addOnClickListener(new OnClickListener{
                     public void onClick(...){
                     }
                     });       
            }

@Override
            public View newView(Context context, Cursor cursor, ViewGroup parent) {
                LayoutInflater inflater = LayoutInflater.from(context);
                View v = inflater.inflate(R.layout.item, parent, false);
                return v;
            }
        }

Метод bindView (....) будет вызываться для каждого необработанного курсора, но он будет установлен в другую позицию, его нельзя изменить внутри этого метода. Затем просто привяжите этот адаптер к вашему ListView с помощью метода setAdapter (....).

0 голосов
/ 29 мая 2011

Если я правильно понимаю ваш вопрос, похоже, что ваша основная проблема заключается в определении того, на каком элементе щелкнули адаптер. Возможно, вам придется переключиться с bindview и newview на использование getview. Если вы это сделаете, вы можете просто добавить onClicklistener в представление, прежде чем getView вернет его. Таким образом, каждая строка в списке имеет своего собственного слушателя и может обновить правильную строку в БД. Любая конкретная информация, которая необходима onClickListener для запуска правильного метода обновления базы данных (например, rowId), также может быть передана в прослушиватель с тегом на представлении. Надеюсь, это поможет.

...