zoukankan      html  css  js  c++  java
  • listview

     ListView设置emptyView的限制

      最新开发一个应用程序,当ListView为空时需要设置一些View来显示提示内容。我们知道ListView有一个公开的方法——setEmptyView(View v)——用来设置ListView为空时的内容。可是这个方法的设置是有限制的,就是设置的View必需在当前的View hierarchy里,亦即这个View需要被add到当前Viewhierarchy的一个结点上,如果没有添加到结点上的话,调用setEmptyView(View v)是没有任何效果的。它的过程大概是:

      ListView listview = (ListView) findViewById(R.id.list);
            View emptyView = findViewById(R.id.empty);
            ViewGroup parentView = (ViewGroup) listview.getParent();
            parentView.addView(emptyView, 2); // 你需要在这儿设置正确的位置,以达到你需要的效果。
            listview.setEmptyView(emptyView);

    注意:如果你直接在XML中包含了emptyView,那么也就不需要再额外添加到Viewhierarchy中了,因为它已经在那儿了,比如你的Layout是:

    <?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:gravity="center_vertical"
            android:orientation="vertical" >
    
            <include layout="@layout/fixed_headerview" />
    
            <ListView
                android:id="@+id/list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:drawSelectorOnTop="false"
                android:fastScrollEnabled="true"
                android:textSize="18sp" />
    
            <TextView
                android:id="@+/empty"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:padding="15dip"
                android:text="@string/text_no_song"
                android:textSize="22sp"
                android:visibility="gone" />
        </LinearLayout>

    那你只需要以下的代码就可以了:

    ListView listview = (ListView) findViewById(R.id.list);  
    View emptyView = findViewById(R.id.empty);  
    listview.setEmptyView(emptyView);  
     
    1. 必须在setAdapter之前执行addHeaderView方法,否则会出现以下异常
    java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.

    public void addHeaderView(View v, Object data, boolean isSelectable) {
       
            // 只要mAdapter不为空就抛出此异常
            if (mAdapter != null && ! (mAdapter instanceof HeaderViewListAdapter)) {
                throw new IllegalStateException(
                        "Cannot add header view to list -- setAdapter has already been called.");
            }
      
            ......
        }

    2. addHeaderView会造成位置偏移
     

        public void setAdapter(ListAdapter adapter) {

            .....

            if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
                mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);
            } else {
                mAdapter = adapter;
            }
            .....
        }

    而listview的onitemclick方法中:

     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3)
    arg2是当前click的位置,这个位置是指在tempadapter中的位置,从0开始如果listview中添加了header则0代表header。

     

    解决办法就是

    listview.setOnItemClickListener(new OnItemClickListener() {
       @Override
       public void onItemClick(AdapterView<?> parent, View view,
         int position, long id) {

     

        Cursor adptperCursor = (Cursor) parent.getAdapter().getItem(position);

    }

    parent.getAdapter()获得封装的之后的adapter

     

    为什么HeaderView需要包装一个HeaderViewListAdapter?
         为什么addHeaderView时adapter必须为空
    1. 先来看下ListView的继承体系
    ListView -> AbsListView -> AdapterView -> ViewGroup
     
    2. ListView继承自ViewGroup,如果需要添加视图只能通过ViewGroup.addView()添加,而在AdapterView.addView中可以看到此方法已经不让使用
     
        public void addView(View child) {
            throw new UnsupportedOperationException("addView(View) is not supported in AdapterView");
        }
     
    3.如果要获得传进如listview的adapter可以通过以下方法获得

     if(listview!=null){
       //listview.setAdapter(null);
       ListAdapter adapter=listview.getAdapter();
       if(adapter!=null ){
        try{
         HeaderViewListAdapter listviewApater=(HeaderViewListAdapter)adapter;
         DailayNewDetailListViewAdapter dailayNewDetailListViewAdapter = (DailayNewDetailListViewAdapter)listviewApater.getWrappedAdapter();
        }catch (Exception e) {
         e.printStackTrace();
        }
        
       }
      }

     
     
     
  • 相关阅读:
    Centos设置开机启动Apache和Mysql[总结]
    主机无法访问虚拟机的apache解决办法
    PHP使用DOM XML操作XML[总结]
    Linux下C结构体初始化[总结]
    libxml2的安装及使用[总结]
    Linux动态链接库的使用
    linux获取系统启动时间
    解析oui.txt文件,通过MAC前缀获取Organization
    linux命令学习——cat
    linux内核数据结构之kfifo
  • 原文地址:https://www.cnblogs.com/mingfeng002/p/2995076.html
Copyright © 2011-2022 走看看