2017-03-04 12 views
1

Ich habe eine RecyclerView welche Artikel ich von json Antwort bevölkern.RecyclerView zeigt keinen Artikel

public class UserProfile extends AppCompatActivity { 

private UserData userData; 
private ProfileNewsFeedAdapter adapter; 
private ArrayList<ProgramModel> list; 
private RecyclerView profileNewsFeed; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.user_profile_activity); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    userData = new UserData(this); 
    list = new ArrayList<>(); 
    adapter = new ProfileNewsFeedAdapter(getActivity(), list); 

    initializeViews(); 
} 

private void initializeViews() { 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    toolbar.setTitle(userData.getName()); 

    TextView userEmail = (TextView) findViewById(R.id.emailPrfId); 
    TextView birthday = (TextView) findViewById(R.id.birthdayId); 
    TextView userClass = (TextView) findViewById(R.id.userClassId); 

    userEmail.setText(userData.getEmail()); 
    birthday.setText("Ditëlindja: " + userData.getBirthday()); 
    userClass.setText("Klasa: " + userData.getUserClass()); 
    setFont(userEmail); 
    setFont(birthday); 
    setFont(userClass); 

    profileNewsFeed = (RecyclerView) findViewById(R.id.profileNewsFeed); 
    profileNewsFeed.setLayoutManager(new LinearLayoutManager(this)); 
    profileNewsFeed.setItemAnimator(new DefaultItemAnimator()); 
    profileNewsFeed.setHasFixedSize(true); 
    profileNewsFeed.setAdapter(adapter); 


    GetBorrowedBooks getBorrowedBooks = new GetBorrowedBooks(); 
    getBorrowedBooks.execute(); 
} 

private void setFont(TextView textView) { 
    textView.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/Roboto-Light.ttf")); 
} 

private AppCompatActivity getActivity() { 
    return this; 
} 


private class GetBorrowedBooks extends AsyncTask<Void, Void, Void> { 


    @Override 
    protected Void doInBackground(Void... voids) { 
     String userId = userData.getUserId(); 

     StringRequest stringRequest = new StringRequest(Request.Method.GET, "http://ec2-52-39-232-168.us-west-2.compute.amazonaws.com/user/" + userId + "/requests", new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       try { 
        JSONArray jsonArray = new JSONArray(response); 

        if (jsonArray.length() > 0) { 
         for (int i = 0; i < jsonArray.length(); i++) { 
          JSONObject jsonObject = jsonArray.getJSONObject(i); 
          String imageName = "http://ec2-52-39-232-168.us-west-2.compute.amazonaws.com/files/books/" + jsonObject.getString("cover"); 

          list.add(new ProgramModel(jsonObject.getString("title"), jsonObject.getString("author"), imageName)); 
         } 
        } 

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

      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       MyDynamicToast.errorMessage(AppController.getInstance(), "Volley did not respond!"); 
      } 
     }); 

     AppController.getInstance().addToRequestQueue(stringRequest); 

     return null; 
    } 
} 

} 

Dies ist der Adapter Code:

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

private AppCompatActivity activity; 
private ArrayList<ProgramModel> program; 
private LayoutInflater inflater; 

public ProfileNewsFeedAdapter(AppCompatActivity activity, ArrayList<ProgramModel> program) { 
    this.activity = activity; 
    inflater = activity.getLayoutInflater(); 
    this.program = program; 
} 

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    TextView title, author; 
    ImageView bookImage; 

    MyViewHolder(View v) { 
     super(v); 
     title = (TextView) v.findViewById(R.id.bookTitleBorrowId); 
     author = (TextView) v.findViewById(R.id.bookAuthorBorrowId); 
     bookImage = (ImageView) v.findViewById(R.id.bookImageBorrowCardId); 
    } 

    void setMenuDetail(ProgramModel model, final int position) { 
     title.setText(model.getTitle()); 
     author.setText(model.getMessage()); 

     // Set text fonts 
     title.setTypeface(Typeface.createFromAsset(activity.getAssets(), "fonts/Roboto-Bold.ttf")); 
     author.setTypeface(Typeface.createFromAsset(activity.getAssets(), "fonts/Roboto-Light.ttf")); 

     Picasso.with(activity).load(model.getImageUrl()).into(bookImage); 

     bookImage.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View view) { 
     switch (view.getId()) { 
      case R.id.bookImageCardId: 
       new GetBookInfo(activity, title.getText().toString()).execute(); 
       break; 
     } 
    } 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = inflater.inflate(R.layout.profile_cardview_item, parent, false); 
    return new MyViewHolder(v); 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    ProgramModel menuModel = program.get(position); 
    holder.setMenuDetail(menuModel, position); 
} 

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

private class GetBookInfo extends AsyncTask<Void, Void, Void> { 

    private String bookTitle, bookAuthor, bookDescription, requestedBook, bookUrl, bookId; 
    private int copies; 
    private Context c; 

    GetBookInfo(Context c, String requestedBook) { 
     this.c = c; 
     this.requestedBook = requestedBook; 
    } 

    @Override 
    protected void onPreExecute() { 
    } 

    @Override 
    protected Void doInBackground(Void... voids) { 
     fetchBookInfo(); 
     return null; 
    } 

    private void fetchBookInfo() { 
     StringRequest stringRequest = new StringRequest(Request.Method.GET, AppConfig.URL_FETCH_BOOKS, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       try { 
        JSONArray jsonArray = new JSONArray(response); 
        for (int i = 0; i < jsonArray.length(); i++) { 
         JSONObject jsonObject = jsonArray.getJSONObject(i); 
         if (jsonObject.getString("title").equals(requestedBook)) { 
          bookId = "" + jsonObject.getInt("id"); 
          bookTitle = jsonObject.getString("title"); 
          bookAuthor = jsonObject.getString("author"); 
          bookDescription = jsonObject.getString("description"); 
          copies = jsonObject.getInt("quantity"); 
          setBookUrl("http://ec2-52-39-232-168.us-west-2.compute.amazonaws.com/files/books/" + jsonObject.getString("cover")); 
          Intent intent = new Intent(c, BookActivity.class); 
          intent.putExtra("title", getBookTitle()); 
          intent.putExtra("author", getBookAuthor()); 
          intent.putExtra("bookId", getBookId()); 
          intent.putExtra("description", getBookDescription()); 
          intent.putExtra("copies", getCopies()); 
          intent.putExtra("description", getBookDescription()); 
          intent.putExtra("bookUrl", getBookUrl()); 
          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
          c.startActivity(intent); 
         } 
        } 

       } catch (JSONException e) { 
        e.printStackTrace(); 
        Log.e("JSON Error: ", "" + e.getMessage()); 
       } 

      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       MyDynamicToast.errorMessage(AppController.getInstance(), "Volley Error!"); 
      } 
     }); 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(stringRequest); 
    } 

    String getBookTitle() { 
     return bookTitle; 
    } 

    String getBookAuthor() { 
     return bookAuthor; 
    } 

    String getBookDescription() { 
     return bookDescription; 
    } 

    String getBookId() { 
     return bookId; 
    } 

    int getCopies() { 
     return copies; 
    } 

    private void setBookUrl(String url) { 
     bookUrl = url; 
    } 

    String getBookUrl() { 
     return bookUrl; 
    } 

} 

} 

Dies ist die ProgramModel Klasse, von der ich item Daten erhalten:

public class ProgramModel { 

private String title; 
private String message; 
private int image; 
private String imageUrl; 

public ProgramModel(String title, String message, int image) { 
    this.title = title; 
    this.message = message; 
    this.image = image; 
} 

public ProgramModel(String title, String message) { 
    this.title = title; 
    this.message = message; 

} 

public ProgramModel(String title, String message, String imageUrl) { 
    this.title = title; 
    this.message = message; 
    this.imageUrl = imageUrl; 

} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getMessage() { 
    return message; 
} 

int getImage() { 
    return image; 
} 

public void setImage(int image) { 
    this.image = image; 
} 

public String getImageUrl() { 
    return this.imageUrl; 
} 
} 

Dies ist der Haupt Layout-Code:

<?xml version="1.0" encoding="utf-8"?> 
 
<android.support.design.widget.CoordinatorLayout 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" 
 
    android:background="@color/white" 
 
    android:fitsSystemWindows="true" 
 
    tools:context="com.libraryhf.libraryharryfultz.activity.UserProfile"> 
 

 
    <android.support.design.widget.AppBarLayout 
 
     android:layout_width="match_parent" 
 
     android:layout_height="wrap_content" 
 
     android:theme="@style/AppTheme.AppBarOverlay"> 
 

 
     <android.support.v7.widget.Toolbar 
 
      android:id="@+id/toolbar" 
 
      android:layout_width="match_parent" 
 
      android:layout_height="?attr/actionBarSize" 
 
      android:background="?attr/colorPrimary" 
 
      app:popupTheme="@style/AppTheme.PopupOverlay" /> 
 

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

 
    <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="wrap_content" 
 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 
 

 

 
     <LinearLayout 
 
      android:layout_width="match_parent" 
 
      android:layout_height="wrap_content" 
 
      android:orientation="horizontal" 
 
      android:weightSum="4"> 
 

 
      <android.support.v7.widget.AppCompatImageView 
 
       android:id="@+id/userImageId" 
 
       android:layout_width="0dp" 
 
       android:layout_height="80dp" 
 
       android:layout_marginTop="3dp" 
 
       android:layout_weight="1" 
 
       android:src="@drawable/prf_image" /> 
 

 
      <LinearLayout 
 
       android:layout_width="0dp" 
 
       android:layout_height="wrap_content" 
 
       android:layout_marginTop="3dp" 
 
       android:layout_weight="3" 
 
       android:orientation="vertical" 
 
       android:padding="7dp"> 
 

 
       <android.support.v7.widget.AppCompatTextView 
 
        android:id="@+id/emailPrfId" 
 
        android:layout_width="wrap_content" 
 
        android:layout_height="wrap_content" /> 
 

 
       <android.support.v7.widget.AppCompatTextView 
 
        android:id="@+id/birthdayId" 
 
        android:layout_width="match_parent" 
 
        android:layout_height="wrap_content" 
 
        android:background="?attr/selectableItemBackground" 
 
        android:clickable="true" 
 
        android:paddingTop="7dp" /> 
 

 
       <android.support.v7.widget.AppCompatTextView 
 
        android:id="@+id/userClassId" 
 
        android:layout_width="match_parent" 
 
        android:layout_height="wrap_content" 
 
        android:background="?attr/selectableItemBackground" 
 
        android:clickable="true" 
 
        android:paddingTop="7dp" /> 
 

 
      </LinearLayout> 
 

 
     </LinearLayout> 
 

 
    </android.support.v4.widget.NestedScrollView> 
 

 
    <android.support.v7.widget.RecyclerView 
 
     android:id="@+id/profileNewsFeed" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="match_parent" 
 
     android:layout_marginTop="150dp" 
 
     android:scrollbars="none" /> 
 

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

Dies ist der einzige Punkt Layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/colorAccent"> 

    <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/item_cardView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     card_view:cardBackgroundColor="@color/colorAccent" 
     card_view:cardCornerRadius="4dp" 
     card_view:cardElevation="5dp" 
     card_view:contentPadding="7dp"> 

     <android.support.v7.widget.LinearLayoutCompat 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <TextView 
       android:id="@+id/bookTitleBorrowId" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="start" 
       android:layout_margin="5dp" 
       android:text="@string/dummyText" 
       android:textColor="@color/white" 
       android:textSize="20sp" /> 


      <android.support.v7.widget.LinearLayoutCompat 
       android:layout_width="wrap_content" 
       android:layout_height="0dp" 
       android:layout_marginStart="9dp" 
       android:layout_weight="7" 
       android:orientation="horizontal"> 

       <android.support.v7.widget.AppCompatImageView 
        android:layout_width="16dp" 
        android:layout_height="16dp" 
        android:layout_marginTop="1dp" 
        android:layout_weight="1" 
        app:srcCompat="@drawable/writer_icon" /> 

       <TextView 
        android:id="@+id/bookAuthorBorrowId" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginStart="10dp" 
        android:layout_weight="6" 
        android:text="@string/dummyText" 
        android:textColor="@color/white" 
        android:textSize="13sp" /> 

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


      <ImageView 
       android:id="@+id/bookImageBorrowCardId" 
       android:layout_width="match_parent" 
       android:layout_height="200dp" 
       android:layout_centerHorizontal="true" 
       android:layout_marginBottom="10dp" 
       tools:ignore="ContentDescription" /> 

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




    </android.support.v7.widget.CardView> 
    </LinearLayout> 

Leider sind meine Artikel nicht auf dem Bildschirm zeigt. Ich weiß, dass Recyclerview angezeigt wird, weil ich die Animationen oben und unten bemerken kann, aber die Elemente sind nicht da. Wo bin ich hier falsch gelaufen? Vielen Dank.

Antwort

0

Versuchen Sie, adapter.notifyDataSetChanged(); hinzuzufügen, nachdem Sie ein neues Element zur Liste hinzugefügt haben. Wenn Sie den Adapter nicht benachrichtigen, dass sich die Liste geändert hat, wird die Recycleransicht nicht aktualisiert, sodass die Daten immer die leere Liste sind, die am Anfang deklariert wird.

+0

Ich habe es gerade probiert und trotzdem werden die Artikel dort nicht angezeigt. –

+0

Danke. Das war das Problem. Ich weiß nicht, warum es in einer anderen Aktivität funktioniert, aber hey, ES FUNKTIONIERT! –

0

Sie greifen auf Ansichten von doInBackground zu, doInBackground wird in einem anderen Thread aufgerufen. Sie sollten auf diese Ansichten von onPostExecute() zugreifen, einer AsyncTask-Methode, die im ui-Thread aufgerufen wird.

+0

Ich habe das gleiche auf einer anderen Recyclerview in einer anderen Aktivität getan und es funktioniert. Warum nicht hier? –