Загрузка двух столбцов SQL в просмотр списка, но нужно отобразить только первый столбец Android - PullRequest
3 голосов
/ 28 марта 2019

Я использую базу данных sqllite для хранения двух столбцов: phonename и phonenumber. Я использую arrayList для перебора данных и отображения имени телефона в работающем представлении списка, но мне также нужно перебрать столбец phonenumber под тем же списком. Мне нужно только, чтобы имя телефона отображалось в списке.

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

DataDBAdapter

public long insert(String phonename, String phonenumber)
{
    ContentValues cv = new ContentValues();
    cv.put(COl_MYTABLE_PHONENAME,phonename);
    cv.put(COL_MYTABLE_PHONENUMBER,phonenumber);

    return mDB.insert(TBL_MYTABLE,null,cv);
}

    //---------------------------------------------------------------------------
    // Iterating through the database
    //---------------------------------------------------------------------------
    public ArrayList<String> getAllRowsAsList()
    {
        Cursor csr = mDB.query(TBL_MYTABLE,null,null,null,null,null,null);
        ArrayList<String> rv = new ArrayList<>();
        while (csr.moveToNext())
        {
            rv.add(csr.getString(csr.getColumnIndex(COl_MYTABLE_PHONENAME)));
        }
        return rv;
    }

SelectModemFragment

 private void manageListView(Context context)
    {
        thelist = dbHelper.getAllRowsAsList();  // Extract the list, just the phone names

        // Only setup the adapter and the ListView if the adapter hasn't been setup
        if(arrayAdapter == null)
        {
            // Instantiate the adapter
            arrayAdapter = new ArrayAdapter<>(context,android.R.layout.simple_list_item_1,thelist); //<<<<<<<<<< list included
            display_contacts1.setAdapter(arrayAdapter); //<<<<<<<<<< Tie the adpater to the ListView

            // Set the ListViews OnItemClick Listener
            display_contacts1.setOnItemClickListener(new AdapterView.OnItemClickListener()
            {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id)
                {
                    String namedisplay = arrayAdapter.getItem(position); //<<<<<<<<<< this gets the phone name

                    namedisplay = arrayAdapter.getItem(position);

                    Toast.makeText(view.getContext(), namedisplay + " Selected for Communication", Toast.LENGTH_SHORT).show();
                    Toast.makeText(view.getContext(), phoneNo, Toast.LENGTH_SHORT).show();

                }
            });
    }

1 Ответ

1 голос
/ 28 марта 2019

Выпуск

с использованием ArrayAdapter позволяет передавать только один элемент, таким образом, если вы не прибегаете к сложным / грязным / неэффективным методам, ArrayAdapter действительно действительно подходит только для одного значения.1005 *

Вы можете использовать ArrayList, где your_object имеет члены для всех необходимых значений.т.е. номер телефона и имя телефона.Отмечая, что если вы не используете пользовательский адаптер, вы должны переопределить метод toString для извлечения данных, которые вы хотите отобразить, как это то, что использует стандартный ArrayAdapter.

Alternative (использовать CursorAdapter)

В качестве альтернативы можно использовать адаптер курсора (например, SimpleCursorAdapter), затем вы можете вернуть курсор и использовать его напрямую.Тем не менее, CursorAdapter ТРЕБУЕТ столбца с конкретным именем _id (можно использовать BaseColumns._ID).

Одним из явных преимуществ адаптера Cursor является то, что 4-й паремметр, передаваемый onItemClick / onItemLongClick, представляет собой id строки (если используется правильно), позволяющий затем получить одно значение/ обновить / удалить / пропустить соответствующую выбранную строку.

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

Вы можетедумаю, у меня нет такой колонки.Однако вы можете использовать обычно скрытый столбец rowid и динамически создавать столбец с именем _id.

В помощнике базы данных (DataDBAdapter) может быть метод, например: -

public Cursor getAllRowsAsCursor()
{
    String[] columns = new String[]{"rowid AS " + BaseColumns._ID,"*"}
    return = mDB.query(TBL_MYTABLE,null,null,null,null,null,null)
}

Тогда может использоваться метод ManageList: -

private void manageListView(Context context) {

    myCursor = dbhelper.getAllRowsAsCursor();

    // Only setup the adapter and the ListView if the adapter hasn't been setup
    if(arrayAdapter == null)
    {
        // Instantiate the adapter
        arrayAdapter = new SimpleCursorAdapter(context,android.R.layout.simple_list_item_1,myCursor,new String[]{DataAdapter.COl_MYTABLE_PHONENAME},newint[]{android.R.id.text1},0);
        display_contacts1.setAdapter(arrayAdapter); //<<<<<<<<<< Tie the adpater to the ListView

        // Set the ListViews OnItemClick Listener
        display_contacts1.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                String namedisplay = arrayAdapter.getItem(position); //<<<<<<<<<< this gets the phone name

                String phonenumber = myCursor,getString(myCursor.getColumnIndex(DataAdapter.COL_MYTABLE_PHONENUMBER);

                Toast.makeText(view.getContext(), namedisplay + " Selected for Communication", Toast.LENGTH_SHORT).show();
                Toast.makeText(view.getContext(), phonenumber, Toast.LENGTH_SHORT).show();

            }
        });
    } else {
        arrayAdapter.swapCursor(myCursor);
    }

Примечания

  • MyCursor будет объявлен как переменная класса, например Cursor MyCursor;
  • Instaed из
    • ArrayAdapter<String> arrayAdapter; у вас будет
    • SimpleCursorAdapter arrayAdapter;
  • Выше приведен код ине был протестирован, поэтому возможны ошибки и / или упущения.

Рабочий пример

Ниже приведен код, основанный на коде из предыдущегозаданный вопрос (который, как представляется, следует из)У этого есть два ListViews старый и новый, который использует SimpleCursorAdapter.При нажатии на элемент отображается номер телефона, а также идентификатор.Длительное нажатие на элемент удаляет этот элемент (обновляя оба ListViews).

DataDBAdapter.java имеет два новых метода (поэтому добавьте их): -

//<<<<<<<<<< ADDED
public Cursor getAllRowsAsCursor() {
    return mDB.query(TBL_MYTABLE,null,null,null,null,null,null);
}

public int delete(long id) {
    String whereclause = COL_MYTABLE_ID + "=?";
    String[] whereargs = new String[]{String.valueOf(id)};
    return mDB.delete(TBL_MYTABLE,whereclause,whereargs);
}

SelectModemFragment.java теперь: -

public class SelectModemFragment extends Fragment {

    private SelectModemViewModel mViewModel;
    ListView display_contacts1;
    ArrayAdapter<String> arrayAdapter;
    ArrayList<String> thelist;
    DataDBAdapter dbhelper;

    //<<<<<<<<<< ADDED
    ListView display_contacts2;
    SimpleCursorAdapter sca;
    Cursor MyCursor;

    public static SelectModemFragment newInstance() {
        return new SelectModemFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.select_modem_fragment, container, false);
        display_contacts1 = view.findViewById(R.id.lv001); //<<<<<<<<<< top listview ArrayAdapter<String>
        display_contacts2 = view.findViewById(R.id.lv002);

        dbhelper = new DataDBAdapter(view.getContext());
        AddSomeData();
        manageListView(view.getContext());
        manageListView2();
        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mViewModel = ViewModelProviders.of(this).get(SelectModemViewModel.class);
        // TODO: Use the ViewModel
    }

    //Sets up the ListView if not already setup
    private void manageListView(Context context) {
        thelist = dbhelper.getAllRowsAsList(); //<<<<<<<<<< extract the list (just the phone names) from the database

        // Only setup the adapter and the ListView if the adapter hasn't been setup
        if (arrayAdapter == null) {
            // Instantiate the adapter
            arrayAdapter = new ArrayAdapter<>(context,android.R.layout.simple_list_item_1,thelist); //<<<<<<<<<< list included
            display_contacts1.setAdapter(arrayAdapter); //<<<<<<<<<< Tie the adpater to the ListView

            // Set the ListViews OnItemClick Listener
            display_contacts1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    String name = arrayAdapter.getItem(position); //<<<<<<<<<< this gets the phone name
                    Toast.makeText(view.getContext(),"You clicked the phone named " + name,Toast.LENGTH_SHORT).show();
                }
            });
        } else {
            //<<<<<<<<<< MODIFIED to cope with changes (needs to rebuild the array within the adpater)
            arrayAdapter.clear();
            for (String s: thelist) {
                arrayAdapter.add(s);
            }
            arrayAdapter.notifyDataSetChanged();
        }
    }

    //<<<<<<<<<< ADDED FOR CursorAdapter
    private void manageListView2() {
        MyCursor = dbhelper.getAllRowsAsCursor();
        if (sca == null) {
            sca = new SimpleCursorAdapter(
                    getContext(),
                    android.R.layout.simple_list_item_1,
                    MyCursor,
                    new String[]{DataDBAdapter.COl_MYTABLE_PHONENAME},
                    new int[]{android.R.id.text1},
                    0
            );
            display_contacts2.setAdapter(sca);
            display_contacts2.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Toast.makeText(view.getContext(),
                            "You Clicked the phone name " +
                                    MyCursor.getString(MyCursor.getColumnIndex(DataDBAdapter.COl_MYTABLE_PHONENAME)) +
                                    ". The phonenumber is " +
                                    MyCursor.getString(MyCursor.getColumnIndex(DataDBAdapter.COL_MYTABLE_PHONENUMBER)) +
                                    ". The ID (as passed) is " + String.valueOf(id) +
                                    ". The ID (from Cursor) is " + String.valueOf(MyCursor.getLong(MyCursor.getColumnIndex(DataDBAdapter.COL_MYTABLE_ID)))
                            ,
                            Toast.LENGTH_SHORT).show();
                }
            });
            //<<<<<<<<<< EXTRA delete row on long click
            display_contacts2.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                    dbhelper.delete(id);
                    manageListView2();
                    manageListView(getContext());
                    return true;
                }
            });
        } else {
            sca.swapCursor(MyCursor);
        }
    }

    // Add some testing data (only if none already exists)
    private void AddSomeData() {
        if (DatabaseUtils.queryNumEntries(dbhelper.getWritableDatabase(),DataDBAdapter.TBL_MYTABLE) < 1) {
            dbhelper.insert("Phone 1", "0000000000");
            dbhelper.insert("Phone 2", "1111111111");
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        manageListView2();
        manageListView(getContext());
    }

    @Override
    public void onDetach() {
        super.onDetach();
        MyCursor.close();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...