0

運行我的應用程序我得到一個空白的活動,目前我只有一個應該投影圖像的列表,通過從JSON讀取這些圖像地址,從logcat中我可以看到地址被傳遞給應用程序,並記錄,但不知道爲什麼佈局沒有結構化,我得到一個空白的白色屏幕。android studio CoordinatorLayout&RecyclerView空白?

使用Genymotion - android s6 - android studio 2.1.1

MyActivity;

import java.util.ArrayList; 
    import java.util.Collection; 
    import java.util.HashMap; 
    import java.util.Map; 


    public class MainActivity extends AppCompatActivity { 

ArrayList<String> image_urls = new ArrayList<String>(); 
String[] android_image_urls = new String[image_urls.size()]; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Firebase.setAndroidContext(this); 
    ImagesAddresses(); 
    initViews(); 

} 
public void ImagesAddresses(){ 
    Firebase ref = new Firebase("https://xxxxx.firebaseio.com/xxxxxx/xxx"); 
    ref.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
      Map<String, String> allADR = (HashMap<String, String>) snapshot.getValue(); 
      if (allADR != null) { 
       Collection<String> BlkADR = allADR.values(); 

       image_urls.addAll(BlkADR); 
       android_image_urls = image_urls.toArray(android_image_urls); 

        Log.i("myTag", image_urls.toString()); 

      } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
} 

private void initViews(){ 
    RecyclerView recyclerView = (RecyclerView)findViewById(R.id.card_recycler_view); 
    recyclerView.setHasFixedSize(true); 
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); 
    recyclerView.setLayoutManager(layoutManager); 

    ArrayList androidVersion = prepareData(); 
    DataAdapter adapter = new DataAdapter(getApplicationContext(),androidVersion); 
    recyclerView.setAdapter(adapter); 

} 
private ArrayList prepareData(){ 

    ArrayList android_version = new ArrayList<>(); 
    for(int i=0;i<android_image_urls.length;i++){ 
     AndroidVersion androidVersion = new AndroidVersion(); 
     androidVersion.setAndroid_image_url(android_image_urls[i]); 
     android_version.add(androidVersion); 
    } 
    return android_version; 
} 
} 

activity_main.xml;

<?xml version="1.0" encoding="utf-8"?> 
    <android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true"> 
<android.support.v7.widget.RecyclerView 
    android:id="@+id/card_recycler_view" 
    android:scrollbars="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

    </android.support.design.widget.CoordinatorLayout> 

DataAdapter.java;

package net.janusjanus.interactive_layout; 


import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 

import com.squareup.picasso.Picasso; 

import java.util.ArrayList; 

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> { 
private ArrayList<AndroidVersion> android_version; 
private Context context; 

public DataAdapter(Context context,ArrayList<AndroidVersion> android_version) { 
    this.context = context; 
    this.android_version = android_version; 

} 

@Override 
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_layout, viewGroup, false); 
    return new ViewHolder(view); 
} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int i) { 

    Picasso.with(context).load(android_version.get(i).getAndroid_image_url()).resize(120, 60).into(viewHolder.img_android); 
} 

@Override 
public int getItemCount() { 
    return android_version.size(); 
} 

public class ViewHolder extends RecyclerView.ViewHolder{ 
    ImageView img_android; 
    public ViewHolder(View view) { 
     super(view); 

     img_android = (ImageView)view.findViewById(R.id.img_android); 
    } 
} 
} 

AndroidVersion.java;

package net.janusjanus.interactive_layout; 


public class AndroidVersion { 

private String android_image_url; 


public String getAndroid_image_url() { 
    return android_image_url; 
} 

public void setAndroid_image_url(String android_image_url) { 
    this.android_image_url = android_image_url; 
} 
} 

越過錯誤我得到了以下;

05-15 04:19:57.942 7827-7875/net.janusjanus.interactive_layout I/OpenGLRenderer: Initialized EGL, version 1.4 
05-15 04:19:58.055 7827-7875/net.janusjanus.interactive_layout W/EGL_emulation: eglSurfaceAttrib not implemented 
05-15 04:19:58.056 7827-7875/net.janusjanus.interactive_layout W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xe7d65fe0, error=EGL_SUCCESS 
05-15 04:20:01.188 7827-7827/net.janusjanus.interactive_layout I/myTag: [http://res.cloudinary.com/xxxxx/image/xxxxxx/xxxxxx/fw88v6xu6wybamg9zzt6.jpg, http://res.cloudinary.com/xxxx/image/upload/xxxxx/xxxxdgfddd.jpg, http://res.cloudinary.com/xxxxxxx/jjjjjj/upload/xxxxxxxx/vvvghgggggg.jpg] 

DataAdapter.java; 和我已經搜索到的stackoverflow爲eglSurfaceAttrib沒有實施

增加了模擬器的磁盤大小,實施了Gapp和其他指令,我發現在下面的帖子; Android Studio - Emulator - eglSurfaceAttrib not implemented

但仍然沒有佈局。

由於下面的用戶建議,我將initView的初始化更改爲ImageAddresses的結尾,以便它遵循檢索地址的步驟,並且還記錄了android_version.size();它返回零,因此佈局仍然是空白的,但不知道如何解決這個問題,

Logcat更改後;

05-15 05:59:25.025 3473-3537/net.janusjanus.interactive_layout I/OpenGLRenderer: Initialized EGL, version 1.4 
    05-15 05:59:25.174 3473-3537/net.janusjanus.interactive_layout W/EGL_emulation: eglSurfaceAttrib not implemented 
    05-15 05:59:25.174 3473-3537/net.janusjanus.interactive_layout W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xe08c47a0, error=EGL_SUCCESS 
05-15 05:59:25.253 3473-3473/net.janusjanus.interactive_layout I/myTag: 0 
05-15 05:59:25.253 3473-3473/net.janusjanus.interactive_layout I/myTag: 0 
05-15 05:59:25.655 3473-3473/net.janusjanus.interactive_layout I/myTag: 0 
05-15 05:59:25.656 3473-3473/net.janusjanus.interactive_layout I/myTag: 0 
05-15 05:59:25.656 3473-3473/net.janusjanus.interactive_layout I/myTag: 0 

顯然,這個錯誤的原因是定時執行方法發生衝突,從而由你,我想用戶runOnUiThread,這我不知道如何我的代碼中正確構造的建議,到目前爲止,我在我的MainActivity中嘗試了以下內容;

public class MainActivity extends AppCompatActivity { 

ArrayList<String> image_urls = new ArrayList<String>(); 
String[] android_image_urls = new String[image_urls.size()]; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Firebase.setAndroidContext(this); 
    ImagesAddresses(); 

} 
public void ImagesAddresses(){ 
    Firebase ref = new Firebase("https://xxxxx.firebaseio.com/xxxxx/xxxxx"); 
    ref.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
      Map<String, String> allADR = (HashMap<String, String>) snapshot.getValue(); 
      if (allADR != null) { 
       Collection<String> BlkADR = allADR.values(); 

       image_urls.addAll(BlkADR); 
       android_image_urls = image_urls.toArray(android_image_urls); 

//私有最終字符串android_image_urls [] = android_image_urls

    Log.i("myTag", image_urls.toString()); 

       initViews(); 


      } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 


} 

private void initViews(){ 

    runOnUiThread(new Runnable() { 
     public void run() { 
      //Do something on UiThread 

      RecyclerView recyclerView = (RecyclerView)findViewById(R.id.card_recycler_view); 
      recyclerView.setHasFixedSize(true); 
      RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); 
      recyclerView.setLayoutManager(layoutManager); 

      ArrayList androidVersion = prepareData(); 
      DataAdapter adapter = new DataAdapter(getApplicationContext(),androidVersion); 
      recyclerView.setAdapter(adapter); 

     } 
    }); 


} 
private ArrayList prepareData(){ 

    ArrayList android_version = new ArrayList<>(); 
    for(int i=0;i<android_image_urls.length;i++){ 
     AndroidVersion androidVersion = new AndroidVersion(); 
     androidVersion.setAndroid_image_url(android_image_urls[i]); 
     android_version.add(androidVersion); 
    } 
    return android_version; 
} 

} 但我想它是不是做了正確的方式,因爲應用程序仍然崩潰 - 而我得到以下錯誤;

05-15 07:11:34.935 11327-11327/net.janusjanus.interactive_layout E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: net.janusjanus.interactive_layout, PID: 11327 
                       java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollVertically()' on a null object reference 
                        at android.support.v7.widget.RecyclerView.computeVerticalScrollRange(RecyclerView.java:1654) 
                        at android.view.View.onDrawScrollBars(View.java:13924) 
                        at android.view.View.onDrawForeground(View.java:17657) 
                        at android.view.View.draw(View.java:16189) 
                        at android.support.v7.widget.RecyclerView.draw(RecyclerView.java:3097) 
                        at android.view.View.updateDisplayListIfDirty(View.java:15174) 
                        at android.view.View.draw(View.java:15948) 
                        at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
                        at android.support.design.widget.CoordinatorLayout.drawChild(CoordinatorLayout.java:1077) 
                        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
                        at android.view.View.draw(View.java:16181) 
                        at android.view.View.updateDisplayListIfDirty(View.java:15174) 
                        at android.view.View.draw(View.java:15948) 
                        at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
                        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
                        at android.view.View.updateDisplayListIfDirty(View.java:15169) 
                        at android.view.View.draw(View.java:15948) 
                        at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
                        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
                        at android.view.View.updateDisplayListIfDirty(View.java:15169) 
                        at android.view.View.draw(View.java:15948) 
                        at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
                        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
                        at android.view.View.updateDisplayListIfDirty(View.java:15169) 
                        at android.view.View.draw(View.java:15948) 
                        at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
                        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
                        at android.view.View.updateDisplayListIfDirty(View.java:15169) 
                        at android.view.View.draw(View.java:15948) 
                        at android.view.ViewGroup.drawChild(ViewGroup.java:3609) 
                        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 
                        at android.view.View.draw(View.java:16181) 
                        at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690) 
                        at android.view.View.updateDisplayListIfDirty(View.java:15174) 
                        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281) 
                        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287) 
                        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322) 
                        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615) 
                        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434) 
                        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067) 
                        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
                        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
                        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
                        at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
                        at android.view.Choreographer.doFrame(Choreographer.java:606) 
                        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:148) 
                        at android.app.ActivityThread.main(ActivityThread.java:5417) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+1

@Override public int getItemCount(){ return android_version.size(); } android_version.size()是什麼? returs – Haroon

+0

@Haroon感謝您指出,它正在返回0,你可以在我發佈在更新中的新logcat中看到。所以我不確定該從那裏得出什麼結論!? – JanusJanus

+0

綁定時,您的數據集爲空。在應用到適配器之前檢查 – Haroon

回答

1

ImagesAddresses();您使用Firebase從您的Web服務中檢索數據,你會得到通過委託方法 onDataChange的結果。由於此方法的執行是異步的,因此在調用onDataChange之前調用initViews();,因此調用prepareData()。正如你可以形象android_image_urls仍然是空的。你需要做的就是致電initViews();onDataChange,確保initViews();運行在UI Thread上。

+0

那麼,這是我錯過的重要部分,我剛剛改變了它,移動initView();到ImagesAddresses()的底部;方法,仍然是空白活動,但正如Haroon在上面的評論中指出的那樣,android_version.size();返回0?我不確定這個問題是如何發生的以及如何解決這個問題?檢查出新的logcat – JanusJanus

+0

不在ImagesAddresses的末尾。在onDataChange – Blackbelt

+0

的最後,我先做了這個,並且應用程序崩潰了,出現了這個錯誤; java.lang.NullPointerException:嘗試在android.support.v7.widget.RecyclerView.computeVerticalScrollRange(RecyclerView)上的null對象引用 上調用虛擬方法'布爾android.support.v7.widget.RecyclerView $ LayoutManager.canScrollVertically()'。 java:1654) – JanusJanus

相關問題