运行android应用程序时出现空白页

时间:2018-07-03 12:48:29

标签: android json android-recyclerview recycler-adapter

我正在Movies上制作一个android应用程序。我正在使用Volley库和Glide加载动态数据,并使用RecyclerView来显示内容。没有编译时或运行时错误。问题是当我运行应用程序时,屏幕上显示白页,但没有输出。

下面是输出的快照:

click to view output

activity_main.xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerview_id"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="16dp"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    >

</android.support.v7.widget.RecyclerView>

</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

 private final String JSON_URL = 


"https://gist.githubusercontent.com/
aws1994/f583d54e5af8e56173492d3f60dd5ebf/raw
/c7796ba51d5a0d37fc756cf0fd14e54434c547bc/anime.json" ;

private JsonArrayRequest request ;
private RequestQueue requestQueue ;
private List<Anime> lstAnime ;
private RecyclerView recyclerView ;


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

    lstAnime = new ArrayList<>() ;
    recyclerView = findViewById(R.id.recyclerview_id);
    jsonrequest();



}

private void jsonrequest() {

    request = new JsonArrayRequest(JSON_URL, 
    new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {

            JSONObject jsonObject  = null ;

            for (int i = 0 ; i < response.length(); i++ ) {


                try {
                    jsonObject = response.getJSONObject(i) ;
                    Anime anime = new Anime() ;
                    anime.setName(jsonObject.getString("name"));

                   anime.setDescription(jsonObject.getString("description"));
                    anime.setRating(jsonObject.getString("Rating"));
                    anime.setCategories(jsonObject.getString("categories"));
                    anime.setNb_episode(jsonObject.getInt("episode"));
                    anime.setStudio(jsonObject.getString("studio"));
                    anime.setImage_url(jsonObject.getString("img"));
                    lstAnime.add(anime);

                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }

            setuprecyclerview(lstAnime);

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });


    requestQueue = Volley.newRequestQueue(MainActivity.this);
    requestQueue.add(request) ;


}

private void setuprecyclerview(List<Anime> lstAnime) {


    RecyclerViewAdapter myadapter = new RecyclerViewAdapter(this,lstAnime) ;
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(myadapter);

}
}

RecyclerViewAdapter.java

public class RecyclerViewAdapter extends 
RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>
{

private Context mContext;
private List<Anime> mData;
RequestOptions option;

public RecyclerViewAdapter(Context mContext, List<Anime> mData)
{
    this.mContext = mContext;
    this.mData = mData;

    //request option for glide imageview
    option = new RequestOptions().centerCrop().placeholder(R.drawable.loading_shape).error(R.drawable.loading_shape);

}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
{
    View view;
    LayoutInflater inflater = LayoutInflater.from(mContext);
    view = inflater.inflate(R.layout.row_item,parent,false);
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position)
{
    holder.tv_name.setText(mData.get(position).getName());
    holder.tv_rating.setText(mData.get(position).getRating());
    holder.tv_studio.setText(mData.get(position).getStudio());
    holder.tv_category.setText(mData.get(position).getCategories());

    //load image from internet and setting it to the imageview using glide library

    Glide.with(mContext).load(mData.get(position).getImage_url()).apply(option).into(holder.img_thumbnail);

}

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

public class MyViewHolder extends RecyclerView.ViewHolder
{
    TextView tv_name;
    TextView tv_rating;
    TextView tv_studio;
    TextView tv_category;
    ImageView img_thumbnail;

    public MyViewHolder(View itemView)
    {
        super(itemView);
        tv_name = (TextView) itemView.findViewById(R.id.anime_name);
        tv_rating = (TextView) itemView.findViewById(R.id.rating);
        tv_studio = (TextView) itemView.findViewById(R.id.studio);
        tv_category = (TextView) itemView.findViewById(R.id.categories);
        img_thumbnail = (ImageView) itemView.findViewById(R.id.thumbnail);
    }
}

}

AnimeActivity.java

public class AnimeActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_anime);

    // hide the default actionbar
    getSupportActionBar().hide();

    // Recieve data

    String name  = getIntent().getExtras().getString("anime_name");
    String description = 
    getIntent().getExtras().getString("anime_description");
    String studio = getIntent().getExtras().getString("anime_studio") ;
    String category = getIntent().getExtras().getString("anime_category");
    int nb_episode = getIntent().getExtras().getInt("anime_nb_episode") ;
    String rating = getIntent().getExtras().getString("anime_rating") ;
    String image_url = getIntent().getExtras().getString("anime_img") ;

    // ini views

    CollapsingToolbarLayout collapsingToolbarLayout = 
    findViewById(R.id.collapsingtoolbar_id);
    collapsingToolbarLayout.setTitleEnabled(true);

    TextView tv_name = findViewById(R.id.aa_anime_name);
    TextView tv_studio = findViewById(R.id.aa_studio);
    TextView tv_categorie = findViewById(R.id.aa_categorie) ;
    TextView tv_description = findViewById(R.id.aa_description);
    TextView tv_rating  = findViewById(R.id.aa_rating) ;
    ImageView img = findViewById(R.id.aa_thumbnail);

    // setting values to each view

    tv_name.setText(name);
    tv_categorie.setText(category);
    tv_description.setText(description);
    tv_rating.setText(rating);
    tv_studio.setText(studio);

    collapsingToolbarLayout.setTitle(name);


    RequestOptions requestOptions = new 

 RequestOptions().centerCrop()
.placeholder(R.drawable.loading_shape).error(R.drawable.loading_shape);


    // set image using Glide
    Glide.with(this).load(image_url).apply(requestOptions).into(img);





}
}

Anime.java(模型类)

public class Anime {

private String name ;
private String description;
private String rating ;
private int nb_episode;
private String image_url;
private String categories;
private String studio;

public Anime() {
}

public Anime(String name, String description, String rating, int nb_episode, String image_url, String categorie, String studio) {
    this.name = name;
    this.description = description;
    this.rating = rating;
    this.nb_episode = nb_episode;
    this.image_url = image_url;
    this.categories = categories;
    this.studio = studio;
}


public String getName() {
    return name;
}

public String getDescription() {
    return description;
}

public String getRating() {
    return rating;
}

public int getNb_episode() {
    return nb_episode;
}

public String getImage_url() {
    return image_url;
}

public String getCategories() {
    return categories;
}

public String getStudio() {
    return studio;
}


public void setName(String name) {
    this.name = name;
}

public void setDescription(String description) {
    this.description = description;
}

public void setRating(String rating) {
    this.rating = rating;
}

public void setNb_episode(int nb_episode) {
    this.nb_episode = nb_episode;
}

public void setImage_url(String image_url) {
    this.image_url = image_url;
}

public void setCategories(String categories) {
    this.categories = categories;
}

public void setStudio(String studio) {
    this.studio = studio;
}

}

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sahil.moviesjam">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".AnimeActivity"></activity>
</application>

</manifest>

build.gradle

dependencies 
    {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.+'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:0.5'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.2.2'

implementation 'com.android.volley:volley:1.0.0'
implementation 'com.android.support:cardview-v7:27.1.1'
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.android.support:design:27.1.1'
implementation 'com.github.bumptech.glide:glide:4.6.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.6.1'

}

2 个答案:

答案 0 :(得分:1)

仔细检查您的logcat,其中显示org.json.JSONException: No value for categories

用该行替换您的行

anime.setCategories(jsonObject.getString("categorie"));

也可以替换模态类

private String categorie="";
//change key in whole modal class

它将按您的期望为您服务。

答案 1 :(得分:0)

JSON参数错误。 替换行:

anime.setCategories(jsonObject.getString("categories"));

使用

anime.setCategories(jsonObject.getString("categorie"));
相关问题