android - 自定义 ListView 不显示

标签 android android-listview android-adapter

我在做什么:

I am writing an android app that has to do with maps and routes etc. On the home screen of the application , there is a button that opens the favorites page. The favorites page is comprised out of the following xml layout.

layout_favorites.xml

<?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:background="@drawable/mainscreen2">
        <HorizontalScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scrollbarSize="0dp"
        >
            <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
                <ImageView
                android:id="@+id/imageViewfavorites"
                android:scaleType="fitEnd"
                android:layout_marginTop="10dp"
                android:layout_marginBottom="3dp"
                android:layout_marginLeft="3dp"
                android:layout_marginRight="3dp"
                android:layout_width="60px"
                android:layout_height="60px"
                android:src="@drawable/android_button_44_2"/>
                <TextView
                android:id="@+id/textview_favorites"
                android:background="@null"
                android:scaleType="fitEnd"
                android:layout_marginTop="15dp"
                android:layout_marginBottom="3dp"
                android:layout_marginLeft="3dp"
                android:layout_marginRight="3dp"
                android:layout_width="wrap_content"
                android:layout_height="60px"
                android:textSize="35sp"
                android:textColor="#000000"
                android:text="Favorites"/>
            </LinearLayout>
        </HorizontalScrollView>
        <ListView
            android:id="@+id/listview_favorites"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginTop="45dp"
            android:cacheColorHint="#00000000"
            >
            </ListView>
</LinearLayout>

一切正常,不用担心。在顶部布局中,您将看到有一个ListView。我想用如下所示的行填充该 ListView:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="5dip" >
        <ImageView
            android:id="@+id/route_image"
            android:layout_width="50dip"
            android:layout_height="50dip"/>
    <TextView
        android:id="@+id/route_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/route_image"
        android:layout_toRightOf="@+id/route_image"
        android:textColor="#000000"
        android:textSize="15dip"
        android:textStyle="bold"/>
    <TextView
        android:id="@+id/route_author"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/route_title"
        android:textColor="#000000"
        android:textSize="10dip"
        android:layout_marginTop="1dip"
        android:layout_toRightOf="@+id/thumbnail"/>
    <TextView
        android:id="@+id/route_length"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@id/route_title"
        android:gravity="right"
        android:layout_marginRight="5dip"
        android:textSize="10dip"
        android:textColor="#10bcc9"
        android:textStyle="bold"/>
     <ImageView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@drawable/arrow"/>
</RelativeLayout>

所以最后,它应该看起来像这样:

(用油漆绘制的图像:p) http://s9.postimage.org/cgcahc1i7/Untitled.png

或者

http://imageshack.us/photo/my-images/694/67362201.png/

现在,问题就出在这里。它不显示。我正在使用一个自定义适配器,它扩展了 BaseAdapter 类来处理 Listview 并膨胀 View 等。我将发布适配器,然后发布收藏夹屏幕的 Activity 。

适配器类:

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;


/**
 *
 * @author Gideon
 */
public class Adapter_Maplist_Page_Favorites extends BaseAdapter
{
    //----------------------------------------
    //  Variables
    //----------------------------------------
        private Context context;
        private final Drawable[] drawables;
        private final String[] titles;
        private final String[] authors;
        private final String[] durations;
    //----------------------------------------

    //----------------------------------------
    //  Methods
    //----------------------------------------


        public Adapter_Maplist_Page_Favorites(Context context ,String[] titles,String[] authors,String[] durations,Drawable[] drawables)
        {

            this.context = context;
            this.titles = titles;
            this.authors = authors;
            this.durations = durations;
            this.drawables = drawables;
        }

        public View getView(int position, View convertView, ViewGroup parent)
        {

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View rowView = inflater.inflate(R.layout.layout_favorites_row, parent);


                ImageView map_image = (ImageView) rowView.findViewById(R.id.route_image);
            TextView map_title = (TextView) rowView.findViewById(R.id.route_title);
            TextView map_author = (TextView) rowView.findViewById(R.id.route_author);
                TextView map_length = (TextView) rowView.findViewById(R.id.route_length);
                ImageView map_image_arrow = (ImageView) rowView.findViewById(R.drawable.arrow);

                map_image.setBackgroundDrawable(drawables[position]);
                map_title.setText(titles[position]);
                map_author.setText(authors[position]);
                map_length.setText(durations[position]);
                map_image_arrow.setBackgroundDrawable(map_image_arrow.getBackground());


        return rowView;
    }
        //----------------------------------------

        //----------------------------------------
        // Not Implemented
        //----------------------------------------
        public Object getItem(int arg0)
        {
            return null;
        }

        public long getItemId(int position)
        {
           return 0;
        }

        public int getCount()
        {
            throw new UnsupportedOperationException("Not supported yet.");
        }
            //----------------------------------------
    //----------------------------------------
}

最喜欢的 Activity 类别:

import android.app.ListActivity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.Toast;



/**
 *
 * @author Gideon
 */
public class Page_Favorites extends ListActivity
{
    //---------------------------------------------------------------------------------------------------------------
    //Hierdie info sal in die toekoms vanaf die databsae moet kom of net vervang word met die database entries in for loops etc. (This info will be loaded from the database in the future)
    //---------------------------------------------------------------------------------------------------------------
    public final String[] map_titles = {"Route 1","Route 2","Route 3","Route 4","Route 5","Route 6"};
    public final String[] map_authors = {"Jannie","Sannie","Bennie","Kosie","Gideon","Alex"};
    public final String[] map_lengths = {"42km","2km","21.5km","8km","34km","23km"};
    ImageView iv = (ImageView) findViewById(R.drawable.route_image_1);
    public final Drawable[] map_images = {iv.getBackground(),iv.getBackground(),iv.getBackground(),iv.getBackground(),iv.getBackground(),iv.getBackground()};
    //---------------------------------------------------------------------------------------------------------------

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle)
    {
        super.onCreate(icicle);
        overridePendingTransition(R.layout.animation_fadein, R.layout.animation_fadeout);
        setContentView(R.layout.layout_favorites);
        // ToDo add your GUI initialization code here

        ListView list = (ListView) findViewById(R.id.listview_favorites);
        list.setAdapter(new Adapter_Maplist_Page_Favorites(this, map_titles, map_authors, map_lengths, map_images));

        list.setOnItemClickListener(new OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id)
            {
               Toast.makeText(Page_Favorites.this, "" + position, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

当我单击按钮启动收藏夹屏幕/Activity 并创建 listview 时,应用程序退出并出现错误(被迫退出...)。任何帮助或想法将不胜感激。谢谢。

编辑:

Adb 日志错误:

22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime  FATAL EXCEPTION: main
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime  java.lang.RuntimeException: Unable to start activity ComponentInfo{RedPheasant.LoggerApp/RedPheasant.LoggerApp.Page_Favorites}: java.lang.NullPointerException
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.app.ActivityThread.access$1500(ActivityThread.java:117)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.os.Handler.dispatchMessage(Handler.java:99)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.os.Looper.loop(Looper.java:123)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.app.ActivityThread.main(ActivityThread.java:3687)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at java.lang.reflect.Method.invokeNative(Native Method)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at java.lang.reflect.Method.invoke(Method.java:507)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at dalvik.system.NativeStart.main(Native Method)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime  Caused by: java.lang.NullPointerException
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at RedPheasant.LoggerApp.Page_Favorites.onCreate(Page_Favorites.java:48)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
22:54:21.505    24082   ERROR   RedPheasant.LoggerApp   AndroidRuntime      ... 11 more
22:54:21.515    212 ERROR   #212        Dumpstate > /data/log/dumpstate_app_error

另外,修复了这部分:

public int getCount()
    {
       if(titles == null)
        {
            return 0;
        }
        return titles.length;
    }

仍然遇到同样的问题。 编辑2:

好的,伙计们,感谢迄今为止提供的所有帮助...

我还对此进行了更改:

新的收藏夹页面 Activity (已修改):

public class Page_Favorites extends Activity
{




    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle)
    {
        super.onCreate(icicle);
        overridePendingTransition(R.layout.animation_fadein, R.layout.animation_fadeout);
        setContentView(R.layout.layout_favorites);
        // ToDo add your GUI initialization code here

        //---------------------------------------------------------------------------------------------------------------
        //Hierdie info sal in die toekoms vanaf die databsae moet kom of net vervang word met die database entries in for loops etc.
        //---------------------------------------------------------------------------------------------------------------


        String[] map_titles = {"Route 1","Route 2","Route 3","Route 4","Route 5","Route 6"};
        String[] map_authors = {"Jannie","Sannie","Bennie","Kosie","Gideon","Alex"};
        String[] map_lengths = {"42km","2km","21.5km","8km","34km","23km"};
        //ImageView iv = (ImageView) findViewById(R.drawable.route_image_1);
        Drawable d = getResources().getDrawable(R.drawable.route_image_1);
        Drawable[] map_images = {d,d,d,d,d,d};
        Drawable d2 = getResources().getDrawable(R.drawable.arrow);
       //---------------------------------------------------------------------------------------------------------------

        ListView list = (ListView) findViewById(R.id.listview_favorites);
        list.setAdapter(new Adapter_Maplist_Page_Favorites(this, map_titles, map_authors, map_lengths, map_images,d2));//lika a boss itches

        list.setOnItemClickListener(new OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id)
            {
               Toast.makeText(Page_Favorites.this, "" + position, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

新的Adapter类(修改):

public class Adapter_Maplist_Page_Favorites extends BaseAdapter
{
    //----------------------------------------
    //  Variables
    //----------------------------------------
        private Context context;
        private final Drawable[] drawables;
        private final String[] titles;
        private final String[] authors;
        private final String[] durations;
        private final Drawable d;
    //----------------------------------------

    //----------------------------------------
    //  Methods
    //----------------------------------------


        public Adapter_Maplist_Page_Favorites(Context context ,String[] titles,String[] authors,String[] durations,Drawable[] drawables,Drawable d)
        {

            this.context = context;
            this.titles = titles;
            this.authors = authors;
            this.durations = durations;
            this.drawables = drawables;
            this.d = d;
        }
        //----------------------------------------


        public View getView(int position, View convertView, ViewGroup parent)
        {

                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.layout_favorites_row, parent);


                ImageView map_image = (ImageView) rowView.findViewById(R.id.route_image);
        TextView map_title = (TextView) rowView.findViewById(R.id.route_title);
        TextView map_author = (TextView) rowView.findViewById(R.id.route_author);
                TextView map_length = (TextView) rowView.findViewById(R.id.route_length);

                ImageView map_image_arrow = (ImageView) rowView.findViewById(R.id.route_arrow);

                map_image.setBackgroundDrawable(drawables[position]);
                map_title.setText(titles[position]);
                map_author.setText(authors[position]);
                map_length.setText(durations[position]);
                map_image_arrow.setBackgroundDrawable(d);


        return rowView;
    }
        //----------------------------------------

        //----------------------------------------
        // Not Implemented
        //----------------------------------------
        public Object getItem(int arg0)
        {
            return null;
        }

        public long getItemId(int position)
        {
           return 0;
        }

        public int getCount()
        {
           if(titles == null)
            {
                return 0;
            }
            return titles.length;
        }
            //----------------------------------------
    //----------------------------------------
}

以及新的错误日志adblog:

23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime  FATAL EXCEPTION: main
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime  java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.widget.AdapterView.addView(AdapterView.java:461)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.view.LayoutInflater.inflate(LayoutInflater.java:416)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at RedPheasant.LoggerApp.Adapter_Maplist_Page_Favorites.getView(Adapter_Maplist_Page_Favorites.java:73)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.widget.AbsListView.obtainView(AbsListView.java:1554)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.widget.ListView.makeAndAddView(ListView.java:1793)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.widget.ListView.fillDown(ListView.java:718)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.widget.ListView.fillFromTop(ListView.java:775)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.widget.ListView.layoutChildren(ListView.java:1646)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.widget.AbsListView.onLayout(AbsListView.java:1384)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.view.View.layout(View.java:7228)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.view.ViewRoot.performTraversals(ViewRoot.java:1147)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.os.Handler.dispatchMessage(Handler.java:99)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.os.Looper.loop(Looper.java:123)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at android.app.ActivityThread.main(ActivityThread.java:3687)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at java.lang.reflect.Method.invokeNative(Native Method)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at java.lang.reflect.Method.invoke(Method.java:507)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
23:15:15.839    24746   ERROR   RedPheasant.LoggerApp   AndroidRuntime      at dalvik.system.NativeStart.main(Native Method)
23:15:15.849    212 ERROR   #212        Dumpstate > /data/log/dumpstate_app_error

感谢到目前为止的帮助...但仍然遇到相同的错误。

更新:

我猜这是我现在的主要问题:

java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView

我猜这与不支持 View 的适配器有关。我有点困惑:p 哈哈。任何想法。

最终编辑 - 已解决 谢谢所有的帮助。它终于可以工作了,看起来很棒。

主要问题是我将可绘制对象分配给 ImageView 的方式导致了膨胀时出现问题。谢谢 Sam 指出了这一点。另一个主要问题是我必须将 false 参数添加到 inflate 方法中,以免将其复制到根目录。感谢安杰洛指出了这一点。

最佳答案

如果没有 LogCat,我们只能猜测您遇到的错误...

1) 您正在扩展 ListActivity:

public class Page_Favorites extends ListActivity

要求您在传递给 setContentView() 的布局中具有属性 android:id="@android:id/list" 的 ListView。我只是建议您只扩展一个 Activity:

public class Page_Favorites extends Activity

因为您当前的代码不依赖于 ListActivity。

2)断章取义:

ImageView iv = (ImageView) findViewById(R.drawable.route_image_1);
public final Drawable[] map_images = {iv.getBackground(),iv.getBackground(),iv.getBackground(),iv.getBackground(),iv.getBackground(),iv.getBackground()};

在创建 Activity 之前不能引用 findViewById(),这应该在 setContentView() 之后的 onCreate() 中完成。

3) 您应该将可绘制对象加载到 ImageView 中,如下所示:

ImageView iv = (ImageView) findViewById(R.id.imageViewfavorites);
iv.setImageResource(R.drawables.route_image_1);

我猜到了您想要图像的位置...这是您想要做的吗?

已经有足够多的人对 getCount() 发表了评论,所以我不会重申。

4) 在适配器的 getView() 中,更改以下内容:

View rowView = inflater.inflate(R.layout.layout_favorites_row, parent);

对此:

View rowView = inflater.inflate(R.layout.layout_favorites_row, parent, false);

关于android - 自定义 ListView 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11440953/

相关文章:

java - 单击 fragment ListView 上的项目后如何刷新数据

android - 在 android.R.layout.simple_list_item_1 上使用 butterknife 绑定(bind) View

android - 除了适配器之外,还有其他方法可以将数据实现到 Activity 中吗?

java - 如何获取ListView中显示的Spinners的值?

android - ListView 文本消失

android - 更改 recyclerview 适配器中的项目

java - 如何开发使用 Android 源代码中的 C 文件的应用程序

android - 在 Android 中创建临时文件

Android:在 TextView 中设置内联 html 链接的样式

android - Fabric BETA 已更新,现在我无法安装我的应用程序,无论是 BETA、Android Studio 还是 apk