Нажмите на элемент списка из Sqlite и показать соответствующий столбец на основе списка - PullRequest
2 голосов
/ 26 апреля 2019

У меня есть таблица Sqlite, как показано ниже.

enter image description here

Я сделал список с помощью rawQuery: SELECT HEADER FROM MyData GROUP BY HEADER

 ArrayAdapter arrayAdapter;
 ArrayList<String> listItem = new ArrayList<>();
 final ListView listView = (ListView) view.findViewById(R.id.list);


 SQLiteDatabase sqLiteDatabase = 
 SqliteDatabase.getInstance(this.getContext()).getWritableDatabase();
 Cursor cursor = sqLiteDatabase.rawQuery("SELECT HEADER FROM MyData GROUP BY 
HEADER", new String[]{});

     if (cursor.getCount() == 0) {
         Toast.makeText(getActivity(), "No Data to show", 
Toast.LENGTH_LONG).show();
     } else {
         while (cursor.moveToNext()) {
             listItem.add(cursor.getString(0));
         }
         arrayAdapter = new ArrayAdapter<>(getActivity(), 
android.R.layout.simple_list_item_1, listItem);
         listView.setAdapter(arrayAdapter);

Список показан ниже:

Letter Number Word

Моя проблема в том, что когда я нажимаю на элемент списка Предположим (Letter), SwipeViews показывает A,

при нажатии Number SwipeViews показывает B и

при нажатии Word SwipeViews показывает C

хочу получить, when I will click on Letter, SwipeViews will show only A,B,C

when I will click on Number, SwipeViews will show only 1,2,3

when I will click on Word, SwipeViews will show only Apple, Orange and Banana

Это OnClickListener

listView.setOnItemClickListener(new OnItemClickListener() {
     @Override
     public void onItemClick(AdapterView<?> adapterView, View view, int i, 
   long l) {
         Intent intent=new Intent(getActivity(), SwipeNav.class);
         intent.putExtra(ID_EXTRA, String.valueOf(l));
         startActivity(intent);
     }
     });

Это от адаптера пейджера

public class MyPagerAdapter extends FragmentStatePagerAdapter {
private Context context;
public MyPagerAdapter(FragmentManager fm, Context context) {
    super(fm);
    this.context= context;}
@Override
public Fragment getItem(int i) {
    ArrayList<String> listItem = new ArrayList<String>();
    SQLiteDatabase sqLiteDatabase = 
SqliteDatabase.getInstance(context).getWritableDatabase();
    Cursor cursor = sqLiteDatabase.rawQuery("SELECT NAME FROM MyData", new 
String[]{});
    if (cursor.getCount() == 0) {
    } else {
        while (cursor.moveToNext()) {
            listItem.add(cursor.getString(0));
        }
    }
    Object[] mStringArray = listItem.toArray();
    Fragment fragment = new AFragment();
    Bundle args = new Bundle();
    args.putString(AFragment.ARG_OBJECT, (String)mStringArray[i]);
    fragment.setArguments(args);
    return fragment;
}

В SwipeNav Activity, я использовал ниже, чтобы получить значение

if (getIntent().hasExtra(ListNavAdapter.ID_EXTRA)){
     String myInt = getIntent().getStringExtra(ListNavAdapter.ID_EXTRA);

     listSwipePagerAdapter = new ListSwipePagerAdapter(getSupportFragmentManager(),this);
    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(listSwipePagerAdapter);

1 Ответ

1 голос
/ 26 апреля 2019

Ваша проблема в том, что вы используете l , ожидая, что это будет идентификатор.Если не используется CursorAdapter, он будет позицией (такой же, как переданный 3-й параметр, кроме long).

  • , то есть если вы нажмете на Письмо, вы передадите 0 через намерение, щелкните по номеру, и оно пройдет 1 , а если вы нажмете на Wordон передаст 2 .

То, что вы хотите передать, - это значение щелчкового представления (номер буквы или слово), а затем использовать его для выбора соответствующих строк.

  • Вы никогда не сможете надежно получить id , поскольку в ArrayList такое значение недоступно.

Поэтому вместо intent.putExtra(ID_EXTRA, String.valueOf(l));Вы хотите

intent.putExtra(ID_EXTRA, ((String)adapterView.getItem(i)));

или поочередно

intent.putExtra(ID_EXTRA,((TextView) view).getText().toString());

Отметив, что значение из списка, то есть различные значения столбца заголовка (буква, число или слово в соответствии с данными примера).

Чтобы затем получить нужные значения, вам потребуется запрос в действии SwipeNav, например

ВЫБРАТЬ ИМЯ ИЗ MyData WHERE HEADER = 'the_value_from_ID_EXTRA'

  • , где the_value_from_ID_EXTRA будет заменено значением, извлеченным из дополнительных функций намерения, с ключом ID_EXTRA, который был передан в действие SwipeNav.

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

...