Android listview inside tab layout inside dialog can't get scroll bars to show up

前端 未结 2 995
轮回少年
轮回少年 2021-01-07 11:49

I have a custom dialog class that extends Dialog. Inside this I have a Tab Layout with 2 tabs. In each tab I have a list view. Everything works but I can\'t get scroll bars

相关标签:
2条回答
  • 2021-01-07 12:20

    OK here is the complete working code for a custom dialog class that contains a tabbed layout which contains a listView. The first tab has a listView with rows being a textView and an imageView with the imageView being right aligned. The second tab has a listView with rows being a single textView. The scroll bars are set to a high fade duration to make them always show. The dialog window itself is set to a static size to prevent the dialog from resizing when switching tabs. The dialog window is also positioned lower on the screen, not in the center. The listViews use custom adapters and the second tab's listView is registered for a context menu.

    I have renamed everything to be more generic and ont contain names of our product, so I may have made some typos when renaming but I think everything is right. Tried to comment the code as best I could. Hope this helps some people.

    The customDialog's 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>
    

    Tab 1 listView row XML (list_view_01_row.xml). This is a textView, left aligned and an imageView, right aligned. The textView has been set to a larger height in order to force the listView rows to be higher. The listView has also been set to a specific width, this pushes the imageView to the right in order to right align it.

    <?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>
    

    Tab 2 listView row XML (list_view_02_row.xml). Same as tab 1 but with a single textView, no 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>
    

    And finally the custom Dialog class.

    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;  
        }  
    }
    
    0 讨论(0)
  • 2021-01-07 12:28

    Try to set all of the android:layout_width attributes within your layout xml to "fill_parent".

    0 讨论(0)
提交回复
热议问题