我是Java和Android Studio中的新成员。 我想在我的应用程序中创建一个列表。 该列表应包含每行中的图片和名称。Android Studio AdapterView崩溃
我跟着我找到的教程,该程序编译没有错误,但是当我运行它 - 它崩溃。
下面是代码:
MainActivity.java:
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
public class MainActivity extends Activity {
ListView listView;
int[] book_poster_resource = { R.mipmap.book_1,
R.mipmap.book_2};
String[] book_titles;
BookAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.list_view);
book_titles = getResources().getStringArray(R.array.book_titles);
int i = 0;
adapter = new BookAdapter(getApplicationContext(), R.layout.row_layout);
listView.setAdapter(adapter);
for(String titles: book_titles)
{
BookDataProvider dataProvider = new BookDataProvider(book_poster_resource[i],
titles);
adapter.add(dataProvider);
i++;
}
}
}
activity_main.xml中:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="com.example.amit.adapterview.MainActivity"
android:background="#000000">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>
BookDataProvider.java:
package com.example.amit.adapterview;
public class BookDataProvider {
private int book_poster_resource;
private String book_title;
public BookDataProvider(int book_poster_resource, String book_title) {
this.book_poster_resource = book_poster_resource;
this.book_title = book_title;
}
public int getBook_poster_resource() {
return book_poster_resource;
}
public void setBook_poster_resource(int book_poster_resource) {
this.book_poster_resource = book_poster_resource;
}
public String getBook_title() {
return book_title;
}
public void setBook_title(String book_title) {
this.book_title = book_title;
}
}
BookAdapter.java:
package com.example.amit.adapterview;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.view.LayoutInflater;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Amit on 23/11/2015.
*/
public class BookAdapter extends ArrayAdapter {
List list = new ArrayList();
public BookAdapter(Context context, int resource) {
super(context, resource);
}
static class DataHandler
{
ImageView poster;
TextView title;
}
@Override
public void add(Object object) {
super.add(object);
list.add(object);
}
@Override
public int getCount() {
return this.list.size();
}
@Override
public Object getItem(int position) {
return this.list.get(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row;
row = convertView;
DataHandler handler;
if(convertView == null)
{
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.row_layout, parent, false);
handler = new DataHandler();
handler.poster = (ImageView)
row.findViewById(R.id.book_poster);
handler.title = (TextView) row.findViewById(R.id.book_title);
row.setTag(handler);
}
else
{
handler = (DataHandler) row.getTag();
}
BookDataProvider dataProvider;
dataProvider = (BookDataProvider) this.getItem(position);
handler.poster.setImageResource(dataProvider.getBook_poster_resource());
handler.title.setText(dataProvider.getBook_title());
return row;
}
}
row_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="#000000">
<ImageView
android:id="@+id/book_poster"
android:layout_width="100dp"
android:layout_height="75dp"
android:layout_alignParentLeft="true"
android:src="@mipmap/book_1"/>
<TextView
android:id="@+id/book_title"
android:layout_width="175dp"
android:layout_height="75dp"
android:layout_toRightOf="@+id/book_poster"
android:text="Book Name"
android:gravity="center"
android:textColor="#FFFFFF"/>
<!-- separate line-->
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="#FFFFFF"
android:layout_below="@+id/book_poster"/>
</RelativeLayout>
任何人都知道为什么它会崩溃吗?
一个我得到的错误是:
at com.example.amit.adapterview.BookAdapter.getView(BookAdapter.java:56)
当我点击 “BookAdapter.java:56” 我重定向到行:
row = inflater.inflate(R.layout.row_layout, parent, false);
(在BookAdapter.java)
感谢您的帮助!
===================
编辑:
在调试,我注意到,在事故被称为 “Choreographer.java” 类的地方发生。有一个称为“doFrame”的功能:
void doFrame(long frameTimeNanos, int frame) {
final long startNanos;
synchronized (mLock) {
if (!mFrameScheduled) {
return; // no work to do
}
if (DEBUG_JANK && mDebugPrintNextFrameTimeDelta) {
mDebugPrintNextFrameTimeDelta = false;
Log.d(TAG, "Frame time delta: "
+ ((frameTimeNanos - mLastFrameTimeNanos) * 0.000001f) + " ms");
}
long intendedFrameTimeNanos = frameTimeNanos;
startNanos = System.nanoTime();
final long jitterNanos = startNanos - frameTimeNanos;
if (jitterNanos >= mFrameIntervalNanos) {
final long skippedFrames = jitterNanos/mFrameIntervalNanos;
if (skippedFrames >= SKIPPED_FRAME_WARNING_LIMIT) {
Log.i(TAG, "Skipped " + skippedFrames + " frames! "
+ "The application may be doing too much work on its main thread.");
}
final long lastFrameOffset = jitterNanos % mFrameIntervalNanos;
if (DEBUG_JANK) {
Log.d(TAG, "Missed vsync by " + (jitterNanos * 0.000001f) + " ms "
+ "which is more than the frame interval of "
+ (mFrameIntervalNanos * 0.000001f) + " ms! "
+ "Skipping " + skippedFrames + " frames and setting frame "
+ "time to " + (lastFrameOffset * 0.000001f) + " ms in the past.");
}
frameTimeNanos = startNanos - lastFrameOffset;
}
if (frameTimeNanos < mLastFrameTimeNanos) {
if (DEBUG_JANK) {
Log.d(TAG, "Frame time appears to be going backwards. May be due to a "
+ "previously skipped frame. Waiting for next vsync.");
}
scheduleVsyncLocked();
return;
}
mFrameInfo.setVsync(intendedFrameTimeNanos, frameTimeNanos);
mFrameScheduled = false;
mLastFrameTimeNanos = frameTimeNanos;
}
try {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "Choreographer#doFrame");
mFrameInfo.markInputHandlingStart();
doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos); // AFTER THIS LINE
mFrameInfo.markAnimationsStart();
doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);
mFrameInfo.markPerformTraversalsStart();
doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
}
if (DEBUG_FRAMES) {
final long endNanos = System.nanoTime();
Log.d(TAG, "Frame " + frame + ": Finished, took "
+ (endNanos - startNanos) * 0.000001f + " ms, latency "
+ (startNanos - frameTimeNanos) * 0.000001f + " ms.");
}
}
在“try”块中,我标记了运行它之后程序崩溃的行。 我不知道它是否可以忽略,但我在这堂课中有很多“无法解决”的错误。像“无法解析方法”traceBegin(?,java.lang.String)'“(我标记的行上面两行)。所以更多...
错误列表的小部分:
11-24 22:31:42.905 16091-16091/com.example.amit.adapterview E/dalvikvm-heap: Out of memory on a 200815888-byte allocation.
11-24 22:31:42.935 16091-16091/com.example.amit.adapterview E/AndroidRuntime: FATAL EXCEPTION: main
11-24 22:31:42.935 16091-16091/com.example.amit.adapterview E/AndroidRuntime: android.view.InflateException: Binary XML file line #7: Error inflating class android.widget.ImageView
11-24 22:31:42.935 16091-16091/com.example.amit.adapterview E/AndroidRuntime: at android.view.LayoutInflater.createView(LayoutInflater.java:626)
11-24 22:31:42.935 16091-16091/com.example.amit.adapterview E/AndroidRuntime: at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
11-24 22:31:42.935 16091-16091/com.example.amit.adapterview E/AndroidRuntime: at android.view.LayoutInflater.onCreateView(LayoutInflater.java:675)
11-24 22:31:42.935 16091-16091/com.example.amit.adapterview E/AndroidRuntime: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:700)
11-24 22:31:42.935 16091-16091/com.example.amit.adapterview E/AndroidRuntime: at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
11-24 22:31:42.935 16091-16091/com.example.amit.adapterview E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
11-24 22:31:42.935 16091-16091/com.example.amit.adapterview E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
11-24 22:31:42.935 16091-16091/com.example.amit.adapterview E/AndroidRuntime: at com.example.amit.adapterview.BookAdapter.getView(BookAdapter.java:55)
row = inflater.inflate(R.layout.row_layout,null,true);尝试分享任何错误或结果。 –
同样,当应用程序启动时,只会打开白色屏幕并显示应用程序停止的消息。在上面观看我的编辑。 – Nick
您尝试分配200MB来创建ImageView的内存不足。你为什么分配200MB? ImageView的来源很大吗? – dsh