我无法在Android手机上加载listview

时间:2014-03-23 15:56:21

标签: android listview

我无法在手机上加载listview。它在logcat中显示错误:

03-24 05:27:14.537: D/AbsListView(22125): unregisterIRListener() is called 

我的代码如下

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        setHasOptionsMenu(true);    
        rootView = inflater.inflate(R.layout.fragment_event, container, false);
        listView = (ListView) rootView.findViewById(R.id.eventListView);
            listView.setVisibility(View.VISIBLE);
        listView.setClickable(true);
        EventArrayAdapter eArrayAdapter = new EventArrayAdapter(getActivity(), R.layout.rowlayout, events);
        listView.setAdapter(eArrayAdapter);
        eArrayAdapter.notifyDataSetChanged();      
            return rootView; 
}

rowlayout.xml

<?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="horizontal" >

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

        <TextView
            android:id="@+id/eventDay"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#1d766f"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="#FFFFFF" />

        <TextView
            android:id="@+id/eventMonth"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#e2fffd"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="#0083af" />

        <TextView
            android:id="@+id/eventTime"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#e2fffd"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="#1d766f" />
    </LinearLayout>

     <LinearLayout android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                     android:orientation="vertical">
        <TextView  
            android:id="@+id/eventName"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#0083af"/>

         <TextView  
            android:id="@+id/eventLocation"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"/>
    </LinearLayout>          
</LinearLayout>

mainlayout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

   <Button
             android:id="@+id/btnAllEvent"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
                 android:text="All Events"           
       />       


  <ListView
        android:id="@+id/eventListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawSelectorOnTop="false"/>    
</LinearLayout>

不幸的是,它没有显示任何内容,甚至列表视图本身。请帮我。谢谢

更新:我使用视图持有人模式

1 个答案:

答案 0 :(得分:0)

您必须简单地返回视图。

另外,为了更好地滚动,您需要实现并理解ViewHolder模式。 你应该使用它的原因是:

  1. 布局通胀是昂贵的操作。
  2. 如果您这样做:

    public View getView(int position, View convertView, ViewGroup parent) {
    
        LayoutInflater mInflater = mContext.getLayoutInflater();
        View item = mInflater.inflate(R.layout.list_item, null);
    
        MyObj data = getItem(position);
    
       ((TextView) item.findViewById(R.id.text1)).setText(data.text1);
       ((TextView) item.findViewById(R.id.text2)).setText(data.text2);
       ((TextView) item.findViewById(R.id.longtext)).setText(data.longText);
       return item;
    }
    

    请不要这样做,因为适配器会为每个位置创建一个新视图,如果你有一个很长的列表,它将导致延迟滚动。想象一下,列表中有500个项目,适配器必须创建500个视图!!!

    所以ViewHolder模式通过改变上面的代码来解决这个问题:

    public View getView(int position, View convertView, ViewGroup parent) {
         Log.d(TAG, "position=" + position);
    
         ViewHolder holder;
         if (convertView == null) {
               convertView = mInflater.inflate(R.layout.list_item, parent, false);
               holder = new ViewHolder();
               holder.text1 = (TextView) convertView.findViewById(R.id.text1);
               holder.text2 = (TextView) convertView.findViewById(R.id.text2);
               holder.longtext = (TextView) convertView.findViewById(R.id.longtext);
               convertView.setTag(holder);
         } else {
               holder = (ViewHolder) convertView.getTag();
         }
    
         MyObj data = getItem(position);
         holder.text1.setText(data.text1);
         holder.text2.setText(data.text2);
         holder.longtext.setText(data.longText);
    
         return convertView;
     }
    

    当ListView要求您回收行布局时,getView方法中的convertView将具有非null值。因此,当convertView不为null时,您应该只更新其内容而不是膨胀新的行布局。

    这个片段的作用是这样的:

    如果ConvertView为null,它将膨胀布局并保存ViewHolder类下的每个视图,ViewHolder的作用是保存视图,然后使用setTag(Object object)将ViewHolder保存在ConverView中,如果convertView不是&# 39; t Null然后它得到这样的ViewHolder对象:holder =(ViewHolder)convertView.getTag(); 然后它使用getView方法中的位置变量从列表中获取当前对象,并通过ViewHolder实例引用everyView。

    也不要使用android:layout_height="wrap_content"因为listView必须调用getView()很多时间来知道它应该有多大,所以请改用android:layout_height="fill_parent"