我有一个RecyclerView,我从json响应填充了哪些项目。
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;
}
}
}
这是适配器代码:
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;
}
}
}
这是ProgramModel类,我可以从中获取项目的数据:
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;
}
}
这是主要的布局代码:
<?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>
这是单项布局:
<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>
不幸的是,我的项目没有显示在屏幕上。我知道reclerview会显示,因为我可以注意到顶部和底部的动画,但项目不存在。我在哪里错了?谢谢。
答案 0 :(得分:0)
您正在从doInBackground访问视图,在另一个线程上调用doInBackground。你应该从onPostExecute()访问那些视图,这是在ui线程上调用的AsyncTask方法。
答案 1 :(得分:0)
在向列表中添加新元素后尝试添加adapter.notifyDataSetChanged();
。如果您没有通知适配器列表已更改,它将不会更新recyclerview,以便数据始终是在开始时声明的空列表。