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();
    }
    
   }
  }

 

 

 
 
 
posted on 2013-04-02 11:15  mingfeng002  阅读(690)  评论(0编辑  收藏  举报