我在做什么:
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/