2015-11-24 47 views
0

我是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) 
+0

row = inflater.inflate(R.layout.row_layout,null,true);嘗試分享任何錯誤或結果。 –

+0

同樣,當應用程序啓動時,只會打開白色屏幕並顯示應用程序停止的消息。在上面觀看我的編輯。 – Nick

+0

您嘗試分配200MB來創建ImageView的內存不足。你爲什麼分配200MB? ImageView的來源很大嗎? – dsh

回答

0

出於某種原因,有一個與圖像的問題。 下面的dsh響應,我試圖使用其他圖像,現在它正在運行。

謝謝!