我在做什么:
我正在编写一个与地图和路线等有关的 android 应用程序。在应用程序的主屏幕上,有一个按钮可以打开收藏夹页面。收藏页面由以下 xml 布局组成。
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 和膨胀视图等。我将发布 Adapater,然后发布收藏夹屏幕的 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.");
}
//----------------------------------------
//----------------------------------------
}
收藏活动课:
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();
}
});
}
}
当我单击按钮启动收藏夹屏幕/活动并创建 listview 时,应用程序退出并出现错误(被迫退出......)。任何帮助或想法将不胜感激。谢谢。
编辑:
亚行日志错误:
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:
好的,伙计们,谢谢到目前为止的所有帮助......
我还改变了这一点:
新的收藏页面活动(修改):
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();
}
});
}
}
新的适配器类(修改):
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;
}
//----------------------------------------
//----------------------------------------
}
以及新的错误日志广告博客:
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
我猜这与不支持视图的适配器有关。我有点困惑 :p 大声笑。有任何想法吗。
最终编辑 - 为所有帮助人员解决了谢谢。它终于工作了,看起来很棒。
主要问题是我将可绘制对象分配给 ImageViews 的方式在进行充气时导致问题。感谢 Sam 指出这一点。另一个主要问题是我必须在 inflate 方法中添加 false 参数才能不将其复制到根目录。感谢 Angelo 指出这一点。