Что я делаю:
Я пишу приложение для 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
OR
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();
}
});
}
}
Когда я нажимаю кнопку, чтобы запустить экран/активность избранного и создать список, приложение завершает работу с ошибкой (было вынуждено выйти...). Любая помощь или идеи будут оценены. Спасибо.
ИЗМЕНИТЬ:
Ошибки журнала 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:
Хорошо, ребята, спасибо за всю помощь...
Кроме того, я изменил это:
Новая активность страницы избранного (измененная):
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;
}
//----------------------------------------
//----------------------------------------
}
И новый журнал ошибок 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
Я предполагаю, что это как-то связано с адаптером, который не поддерживает представление. Я несколько смущен: p lol. Есть идеи.
ПОСЛЕДНИЕ РЕДАКТИРОВАНИЯ — РЕШЕНО Спасибо за помощь, ребята. Наконец-то он работает и выглядит великолепно.
Основные проблемы заключались в том, что способ, которым я назначал чертежи для ImageViews, вызывал проблемы при выполнении раздувания. Спасибо, Сэм, за указание на это. Еще одна серьезная проблема заключалась в том, что мне пришлось добавить параметр false в метод inflate, чтобы не копировать его в корень. Спасибо, Анджело, за указание на это.
at RedPheasant.LoggerApp.Page_Favorites.onCreate(Page_Favorites.java:48)
Сообщает нам об исключении нулевого указателя в строке 48, которая находится в Page_Favorites.onCreate(). Что такое строка 48? - person Sam   schedule 12.07.2012findViewById(R.drawable.route_image_1);
что делаетiv
нулевым. Я обновлю свой ответ решением этой проблемы. - person Sam   schedule 12.07.2012