2015-11-24 2 views
0

Я новичок в Java и Android Studio. Я пытаюсь создать список в своем приложении. Список должен содержать изображение и имя в каждой строке.Android 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)

Спасибо за помощь!

===================

EDIT:

При отладке я заметил, что аварии случаются где-то в классе под названием "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."); 
     } 
    } 

В блоке «попробовать», я отметил линию, что после запуска этого, программа падает. Я не знаю, если это невежественно, но у меня есть много ошибок «Не могу разрешить» в этом классе. Например, «Невозможно разрешить метод» 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

У вас закончилась память, пытаясь выделить 200 МБ для создания ImageView.Почему вы выделяете 200 МБ? Является ли источник ImageView большим? – dsh

ответ

0

По какой-то причине возникла проблема с изображениями. После ответа dsh я попытался использовать другие изображения, и теперь он работает.

Спасибо!

Смежные вопросы