【问题标题】:Click on List Item from Sqlite and show related column based on list单击 Sqlite 中的 List Item 并根据列表显示相关列
【发布时间】:2019-09-16 03:06:38
【问题描述】:

我有一个如下所示的 Sqlite 表。

我已经用 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);

【问题讨论】:

    标签: android sqlite listview android-viewpager cursor


    【解决方案1】:

    您的问题似乎是您正在使用 l,期望它是 id。除非使用 CursorAdapter,否则它将是位置(与传递的第三个参数相同,但 long 除外)。

    • 也就是说,如果您单击 Letter,您将通过 Intent 传递 0,单击 Number,它将传递 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 活动中进行查询,例如

    SELECT NAME FROM MyData WHERE HEADER = 'the_value_from_ID_EXTRA'

    • 其中 the_value_from_ID_EXTRA 将替换为从 Intent Extras 中提取的值,该值具有传递给 SwipeNav 活动的键 ID_EXTRA。

    • 注意以上代码为in-principal code,未经测试或运行,可能存在一些错误。

    【讨论】:

    • 感谢先生帮助我。抱歉先生迟到了回复。我用过 ((String)adapterView.getItemAtPosition(i)));在 ListNavAdapter 中。但是当我点击项目应用程序终止。我在问题中添加了 SwipeNav Activity。这里 int foo = Integer.parseInt(myInt);显示 java.lang.NumberFormatException: Invalid int。在我使用的适配器中 String myString=ListNavAdapter.ID_EXTRA; int foo=Integer.parseInt(myString); "从 MyData WHERE HEADER="+foo 中选择名称
    • 当您获得项目时,您将获得值字母、数字或单词之一。它们无法解析为 int。因此出现 NumberFormatException。只需使用"SELECT NAME FROM MyData WHERE HEADER='" + myInt + "'"(注意=后面是单引号,然后双引号最后一位是双引号,单引号双引号(因此Letter,Number或Word被视为文字值而不是列名) )。
    • 非常感谢。我接受并支持你。再次感谢。我的问题解决了。
    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多