android studio CoordinatorLayout& RecyclerView空白?

时间:2016-05-15 09:04:54

标签: android android-studio android-cardview android-coordinatorlayout

运行我的应用程序我得到一个空白活动,暂时我只有一个列表应该是投影图像,通过从JSON读取这些图像地址,从logcat我可以看到传递给应用程序的地址,并记录,但不知道为什么布局没有结构化,我得到一个空白的白色屏幕。

使用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 for 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,我不知道如何在我的代码中正确构建,到目前为止,我是&#39;我在我的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);

// private final String 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 个答案:

答案 0 :(得分:1)

ImagesAddresses();中,您正在使用Firebase从您的网络服务中检索数据,并通过委托方法获得结果 onDataChange。由于此方法的执行是异步的,因此在调用initViews();之前调用prepareData(),因此调用onDataChange。因为你可以成像android_image_urls仍然是空的。您要解决的问题是从initViews();致电onDataChange,确保initViews();UI Thread上运行。