对话框内选项卡布局中的Android ListView 无法显示滚动条

标签 android listview dialog tabview

我有一个扩展 Dialog 的自定义对话框类。在这里面我有一个带有 2 个选项卡的选项卡布局。在每个选项卡中,我都有一个 ListView 。一切正常,但我无法显示滚动条。

这是我的 XML:

<?xml version="1.0" encoding="utf-8"?>

<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/TabHost01"
android:layout_width="300dp"
android:layout_height="300dp">

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

    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>

    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    <ListView
        android:id="@+id/ListView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        android:scrollbarAlwaysDrawVerticalTrack="true"/>

    <ListView
        android:id="@+id/ListView02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scrollbars="vertical"
        android:scrollbarAlwaysDrawVerticalTrack="true"/>

    </FrameLayout>
</LinearLayout>
</TabHost>

这里是我设置它的部分代码:

    // get this window's layout parameters so we can change the position
WindowManager.LayoutParams params = getWindow().getAttributes(); 

    // change the position. 0,0 is center
    params.x = 0;
    params.y = 250;
    this.getWindow().setAttributes(params); 

    // no title on this dialog
requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.myLayout);

// instantiate our list views for each tab
ListView listView01 = (ListView)findViewById(R.id.ListView01);
ListView listView02 = (ListView)findViewById(R.id.ListView02);


// instantiate and set our custom list view adapters
listViewAdapter01 = new ListViewAdapter01(context);
listView01.setAdapter(listViewAdapter01);

listViewAdapter02 = new ListViewAdapter02(context);
listView02.setAdapter(listViewAdapter02);

// get our tabHost from the xml
TabHost tabs = (TabHost)findViewById(R.id.TabHost01);
tabs.setup();

// create tab 1
TabHost.TabSpec tab1 = tabs.newTabSpec("tab1");
tab1.setContent(R.id.listView01);
tab1.setIndicator("List 1");
tabs.addTab(tab1);

// create tab 2
TabHost.TabSpec tab2 = tabs.newTabSpec("tab2");
tab2.setContent(R.id.listView02);
tab2.setIndicator("List 01");
tabs.addTab(tab2);

最佳答案

好的,这里是自定义对话框类的完整工作代码,该类包含一个包含 ListView 的选项卡式布局。第一个选项卡有一个 listView,其中行是一个 textView 和一个 imageView,其中 imageView 是右对齐的。第二个选项卡有一个 listView,其中的行是单个 textView。滚动条设置为高淡入淡出持续时间以使其始终显示。对话框窗口本身设置为静态大小,以防止对话框在切换选项卡时调整大小。对话窗口也位于屏幕下方,而不是中央。 listViews 使用自定义适配器,第二个选项卡的 listView 注册了上下文菜单。

我已将所有内容重命名为更通用并且包含我们产品的名称,因此我在重命名时可能会出现一些拼写错误,但我认为一切都是正确的。尽我所能评论代码。希望这对某些人有所帮助。

customDialog 的 XML (custom_dialog_layout.xml):

<?xml version="1.0" encoding="utf-8"?>

<TabHost
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/TabHost01"
    android:layout_width="fill_parent"
    android:layout_height="300dip">

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

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

        <ListView
            android:id="@+id/listView01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:scrollbarFadeDuration="1000000"/>

        <ListView
            android:id="@+id/listView02"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:scrollbarFadeDuration="1000000"/>

        </FrameLayout>
    </LinearLayout>
</TabHost>

选项卡 1 listView 行 XML (list_view_01_row.xml)。这是一个左对齐的 textView 和一个右对齐的 imageView。 textView 已设置为更大的高度,以强制 listView 行更高。 listView 也被设置为特定的宽度,这会将 imageView 推到右边以便右对齐。

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingBottom="5dip"
    android:paddingTop="5dip"
    android:paddingLeft="10dip"
    android:paddingRight="10dip">

    <TableLayout
        android:id="@+id/list_view_01_row_table_layout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:stretchColumns="0">

        <TableRow
            android:id="@+id/list_view_01_row_table_row"
            android:gravity="center_vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

                <TextView
                    android:id="@+id/list_view_01_row_text_view"
                    android:textSize="18sp"
                    android:textColor="#ffffff"  
                    android:gravity="center_vertical"
                    android:layout_width="200dip" 
                    android:layout_height="75dip" />

                <ImageView
                    android:id="@+id/list_view_01_row_image_view"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
        </TableRow>
    </TableLayout>
</LinearLayout>

选项卡 2 listView 行 XML (list_view_02_row.xml)。与选项卡 1 相同,但只有一个 textView,没有 imageView。

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingBottom="5dip"
    android:paddingTop="5dip"
    android:paddingLeft="10dip"
    android:paddingRight="10dip">

    <TableLayout
        android:id="@+id/list_view_02_row_table_layout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:stretchColumns="0">

        <TableRow
            android:id="@+id/list_view_02_row_table_row"
            android:gravity="center_vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/list_view_02_row_text_view"
                android:textSize="18sp"
                android:textColor="#ffffff"  
                android:gravity="center_vertical"
                android:layout_width="fill_parent" 
                android:layout_height="75dip" />
        </TableRow>
    </TableLayout>
</LinearLayout>

最后是自定义对话框类。

import android.app.Dialog;
import android.content.Context;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TextView;

/**
 * This is a custom dialog class that will hold a tab view with 2 tabs.
 * Tab 1 will be a list view. Tab 2 will be a list view.
 * 
 */
public class CustomDialog extends Dialog
{
    /**
     * Our custom list view adapter for tab 1 listView (listView01).
     */
    ListView01Adapter listView01Adapter = null;

    /**
     * Our custom list view adapter for tab2 listView (listView02).
     */
    ListView02Adapter listView02Adapter = null;

    /**
     * Default constructor.
     * 
     * @param context
     */
    public CustomDialog(Context context)
    {
        super(context);

        // get this window's layout parameters so we can change the position
        WindowManager.LayoutParams params = getWindow().getAttributes(); 

        // change the position. 0,0 is center
        params.x = 0;
        params.y = 250;
        this.getWindow().setAttributes(params); 

        // no title on this dialog
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.custom_dialog_layout);

        // instantiate our list views for each tab
        ListView listView01 = (ListView)findViewById(R.id.listView01);
        ListView listView02 = (ListView)findViewById(R.id.listView02);

        // register a context menu for all our listView02 items
        registerForContextMenu(listView02);

        // instantiate and set our custom list view adapters
        listView01Adapter = new ListView01Adapter(context);
        listView01.setAdapter(listView01Adapter);

        listView02Adapter = new ListView02Adapter(context);
        listView02.setAdapter(listView02Adapter);

        // bind a click listener to the listView01 list
        listView01.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> parentView, View childView, int position, long id)
            {                   
                // will dismiss the dialog
                dismiss();
            }           
        });

        // bind a click listener to the listView02 list
        listView02.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> parentView, View childView, int position, long id)
            {                   
                // will dismiss the dialog
                dismiss();          
            }           
        });

        // get our tabHost from the xml
        TabHost tabs = (TabHost)findViewById(R.id.TabHost01);
        tabs.setup();

        // create tab 1
        TabHost.TabSpec tab1 = tabs.newTabSpec("tab1");
        tab1.setContent(R.id.listView01);
        tab1.setIndicator("List 1");
        tabs.addTab(tab1);

        // create tab 2
        TabHost.TabSpec tab2 = tabs.newTabSpec("tab2");
        tab2.setContent(R.id.listView02);
        tab2.setIndicator("List 2");
        tabs.addTab(tab2);
    }

    /**
     * A custom list adapter for the listView01
     */
    private class ListView01Adapter extends BaseAdapter
    {        
        public ListView01Adapter(Context context)
        {

        }

        /**
         * This is used to return how many rows are in the list view
         */
        public int getCount()
        {
            // add code here to determine how many results we have, hard coded for now

            return 10;
        }

        /**
         * Should return whatever object represents one row in the
         * list.
         */
        public Object getItem(int position)
        {
            return position;
        }

        /**
         * Used to return the id of any custom data object.
         */
        public long getItemId(int position)
        {
            return position;
        }

        /**
         * This is used to define each row in the list view.
         */
        public View getView(int position, View convertView, ViewGroup parent)
        {            
            View row = convertView;

            // our custom holder will represent the view on each row. See class below.
            ListView01Holder holder = null;

            if(row == null)
            {                                                   
                LayoutInflater inflater = getLayoutInflater();

                // inflate our row from xml
                row = inflater.inflate(R.layout.list_view_01_row, parent, false);

                // instantiate our holder
                holder = new ListView01Holder(row);

                // set our holder to the row
                row.setTag(holder);
            }
            else
            {
                holder = (ListView01Holder)row.getTag();
            }

            return row;
        }

        // our custom holder
        class ListView01Holder
        {
            // text view
            private TextView text = null;

            // image view
            private ImageView image = null;

            ListView01Holder(View row)
            {    
                // get out text view from xml
                text = (TextView)row.findViewById(R.id.image);

                // add code here to set the text
                text.setText("");

                // get our image view from xml
                image = (ImageView)row.findViewById(R.id.list_view_01_row_image_view);

                // add code here to determine which image to load, hard coded for now
                rating.setImageResource(R.drawable.image);
            }
        }
    }

    /**
     * A custom list adapter for listView02
     */
    private class ListView02Adapter extends BaseAdapter
    {        
        public ListView02Adapter(Context context)
        {

        }

        /**
         * This is used to return how many rows are in the list view
         */
        public int getCount()
        {
            // add code here to determine how many results we have, hard coded for now

            return 5;
        }

        /**
         * Should return whatever object represents one row in the
         * list.
         */
        public Object getItem(int position)
        {
            return position;
        }

        /**
         * Used to return the id of any custom data object.
         */
        public long getItemId(int position)
        {
            return position;
        }

        /**
         * This is used to define each row in the list view.
         */
        public View getView(int position, View convertView, ViewGroup parent)
        {            
            View row = convertView;
            ListView02Holder holder = null;

            if(row == null)
            {                                                   
                LayoutInflater inflater = getLayoutInflater();

                row=inflater.inflate(R.layout.list_view_02_row, parent, false);
                holder = new ListView02Holder(row);
                row.setTag(holder);
            }
            else
            {
                holder = (ListView02Holder)row.getTag();
            }

            return row;
        }

        class ListView02Holder
        {
            private TextView text = null;

            ListView02Holder(View row)
            {
                text = (TextView)row.findViewById(R.id.list_view_02_row_text_view);
                text.setText("");
            }
        }
    }

    /**
     * This is called when a long press occurs on our listView02 items.
     */
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
    {
        super.onCreateContextMenu(menu, v, menuInfo);

        menu.setHeaderTitle("Context Menu");  
        menu.add(0, v.getId(), 0, "Delete");  
    }

    /**
     * This is called when an item in our context menu is clicked.
     */
    public boolean onContextItemSelected(MenuItem item)
    {  
        if(item.getTitle() == "Delete")
        {

        }  
        else
        {
            return false;
        }

        return true;  
    }  
}

关于对话框内选项卡布局中的Android ListView 无法显示滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4492162/

相关文章:

android - 如何在 DialogFragment 中正确使用 Android View 绑定(bind)?

c# - 加载时Listview太慢

android - 如何从手机中获取所有联系人并在 android 中单击按钮时显示在 ListView 中?

android - 按顺序显示android对话框

blackberry - 如何在我的自定义 Blackberry 弹出对话框中使用默认对话框图标?

python - 如何显示 PyQt 模式对话框并在关闭后从其控件中获取数据?

Android push c2dm 无法使用 200 ok 响应

java - OpenGL绘图代码没有绘制任何东西

android - 如何将 Android 任务转换为 Kotlin Deferred?

c# - asp :ListView 中当前项目的 Eval()