从CursorAdapter添加视图时ListView消失

时间:2014-04-15 15:41:31

标签: android android-layout listview android-cursoradapter

我的布局包括一个未填充的水平线性布局,下面是多列列表视图。 listview是通过一个单独的java文件中的自定义游标适配器从sqlite表填充的。每次点击列表视图行中的特定视图时,都会动态创建一个按钮并将其添加到线性布局中。由于我不明白的原因,当发生这种情况时,listview内容消失了。如果我更改了设备的方向,它将通过onCreate并且显示正确构建,线性布局按钮在列表视图上正确显示。

主要布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

            <LinearLayout
                android:id="@+id/llRunnerList"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal" >
            </LinearLayout>
        </HorizontalScrollView>

        <ListView
            android:id="@+id/list_data"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>

和自定义游标适配器中的视图侦听器代码:

    private OnClickListener strRunnerOnClickListener = new OnClickListener() {
        @Override
        //
        // When the Runner field is clicked, add the Runner name to the Runner row.
        //
        public void onClick(View v) {
            final DBAdapter databaseHelper = new DBAdapter(ctxThis);

            LayoutParams params =
                    new LinearLayout.LayoutParams(
                        LayoutParams.MATCH_PARENT,
                        LayoutParams.WRAP_CONTENT);

            TextView tvRunner = (TextView) v;
            String strRunner = (String) tvRunner.getText();
            if(RaceSheetActivity.blnRaceRunning) {
                // get the ListView and the position in it.
                ListView lv = (ListView) v.getParent().getParent();
                final int position = lv.getPositionForView((View) v.getParent());

                // get the cursor pointing to that row
                Cursor c = (Cursor) lv.getItemAtPosition(position);
                long lngCurrentId = c.getInt(0);
                long lngRaceId = c.getInt(1);
                c.close();

                // Add to database if doesn't exist
                Cursor cSNRec = databaseHelper.getSNRecByCompetitorId(lngCurrentId);
                if(cSNRec.moveToFirst()) {
                    Toast.makeText(v.getContext(), strRunner + " already in preempt list!", Toast.LENGTH_SHORT).show();
                }
                else {
                    databaseHelper.insertSN(strRunner, lngCurrentId);
                    // Add a button and initialise it
                    ToggleButton btnRunner = new ToggleButton(ctxThis);
                    btnRunner.setText(strRunner);
                    btnRunner.setTextOn(strRunner);
                    btnRunner.setTextOff(strRunner);
                    btnRunner.setTag(lngCurrentId);
                    btnRunner.setLayoutParams(params);
                    btnRunner.setOnClickListener(RaceSheetActivity.btnRunnerOnClickListener);
                    RaceSheetActivity.llRunnerList.addView(btnRunner); // to delete view removeViewAt(int index)
                    changeCursor(databaseHelper.getRaceSheetDataForRace(lngRaceId));
                    notifyDataSetChanged();
                 }
            }
        }
    };

非常感谢有关如何在点击跑步者字段和按钮出现后保持列表视图可见的任何想法。我没有成功尝试notifyDatasetChanged,将数据库表重新读入游标适配器。

3 个答案:

答案 0 :(得分:0)

将布局高度设置为wrap_content,因为带有按钮的ItemList会与Listview重叠,如果它不为空。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/llItemList"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>

        <ListView
            android:id="@+id/list_data"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>

</ScrollView>

答案 1 :(得分:0)

实际上你没有初始化Horizo​​ntalScrll视图而只是关闭Horizo​​ntalscrollview,因为该App返回了这种行为

答案 2 :(得分:0)

实际上,最终解决了这个问题。列表视图正在消失,因为我使用了一个游标来获取返回的行的适配器值,随后关闭游标显然清除了列表视图。

感谢那些提供解决方案的人,尽管他们不是问题的原因。