我正在尝试在 volley 的帮助下从网络获取数据并将其显示在 Recylerview 中。
我可以轻松地在 toast 中显示数据,但在 recylerview 的情况下我遇到了问题。我从 youtube 关注 Slidenerd:
https://www.youtube.com/playlist?list=PLonJJ3BVjZW6CtAMbJz1XD8ELUs1KXaTD
但它没有显示在 Recyclerview 中,有什么想法吗?
FragmentCollege.java 类:
public class FragmentCollege extends Fragment {
public static final String URL_EDUSANJAL_COLLEGE = "http://edusanjal.com/api/edusanjal/college/?format=json";
private VolleySingleton volleySingleton;
private ImageLoader imageLoader;
private RequestQueue requestQueue;
private ArrayList<College> listCollege = new ArrayList<>();
private RecyclerView listCollegeHits;
private AdapterCollege mAdapterCollege;
public FragmentCollege() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
volleySingleton = VolleySingleton.getInstance();
requestQueue = volleySingleton.getRequestQueue();
}
private void sendJsonRequest() {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,
URL_EDUSANJAL_COLLEGE,
(String) null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
listCollege = parseJSONResponse(response);
mAdapterCollege.setCollegeList(listCollege);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(request);
}
private ArrayList<College> parseJSONResponse(JSONObject response) {
ArrayList<College> listCollege = new ArrayList<>();
if (response == null || response.length() == 0) {
try {
StringBuilder data = new StringBuilder();
JSONArray arrayCollege = response.getJSONArray(KEY_OBJECTS);
for (int i = 0; i < arrayCollege.length(); i++) {
JSONObject currentCollege = arrayCollege.getJSONObject(i);
Long id = currentCollege.getLong(KEY_ID);
String title = currentCollege.getString(KEY_TITLE);
String city = currentCollege.getString(KEY_CITY);
String phone = currentCollege.getString(KEY_PHONE);
data.append(id + "\n" + title + "\n" + city + "\t" + phone + "\n" + "\n");
College college = new College();
college.setId(id);
college.setTitle(title);
college.setCity(city);
college.setPhone(phone);
listCollege.add(college);
}
} catch (JSONException e) {
}
L.T(getActivity(), listCollege.toString());
}
return listCollege;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_college, container, false);
listCollegeHits = (RecyclerView) view.findViewById(R.id.listCollegeHits);
listCollegeHits.setLayoutManager(new LinearLayoutManager(getActivity()));
mAdapterCollege = new AdapterCollege(getActivity());
listCollegeHits.setAdapter(mAdapterCollege);
sendJsonRequest();
// Inflate the layout for this fragment
return view;
}
}
fragment_college.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.edusanjal.edusanjal.activity.CollegeFragment">
<!-- TODO: Update blank fragment layout -->
<android.support.v7.widget.RecyclerView
android:id="@+id/listCollegeHits"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/textVolleyError"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="@dimen/size_word"
android:text="#FF4444"
android:visibility="gone"/>
custom_college_layout.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/size_byte"
android:layout_marginLeft="@dimen/size_word"
android:layout_marginRight="@dimen/size_word"
android:layout_marginTop="@dimen/size_byte">
<ImageView
android:id="@+id/collegeLogo"
android:layout_width="@dimen/college_thumbnail_width"
android:layout_height="@dimen/college_thumbnail_height"
android:layout_centerVertical="true"
android:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/collegeTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignTop="@+id/collegeLogo"
android:layout_marginLeft="56dp"
android:alpha="0.87"
android:gravity="right"
android:padding="@dimen/size_half_byte"
android:text="Aadikabi Bhanubhakta Higher Secondary School"
android:textSize="@dimen/size_text_primary"/>
<TextView
android:id="@+id/collegePhone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/collegeTitle"
android:layout_marginLeft="56dp"
android:alpha="0.87"
android:gravity="right"
android:padding="@dimen/size_half_byte"
android:text="Phone"
android:textSize="@dimen/size_text_primary"/>
<TextView
android:id="@+id/collegeCity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/collegePhone"
android:layout_marginLeft="56dp"
android:alpha="0.87"
android:gravity="right"
android:padding="@dimen/size_half_byte"
android:text="city"
android:textSize="@dimen/size_text_primary"/>
<TextView
android:id="@+id/collegeCreatedOn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/collegeCity"
android:alpha="0.87"
android:padding="@dimen/size_half_byte"
android:text="31-31-31"
android:textSize="@dimen/size_text_secondary"/>
AdapterCollege.java:
public class AdapterCollege extends RecyclerView.Adapter<AdapterCollege.ViewHolderCollege> {
private ArrayList<College> listCollege = new ArrayList<>();
private LayoutInflater mLayoutInflater;
private VolleySingleton volleySingleton;
private ImageLoader imageLoader;
private DateFormat dateFormatter=new SimpleDateFormat("yyyy-MM-dd");
public AdapterCollege(Context context) {
mLayoutInflater = mLayoutInflater.from(context);
volleySingleton = VolleySingleton.getInstance();
imageLoader = volleySingleton.getImageLoader();
}
public void setCollegeList(ArrayList<College> listCollege) {
this.listCollege = listCollege;
notifyItemRangeChanged(0, listCollege.size());
}
@Override
public ViewHolderCollege onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mLayoutInflater.inflate(R.layout.custom_college_layout, parent, false);
ViewHolderCollege viewHolder = new ViewHolderCollege(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolderCollege holder, int position) {
College currentCollege = listCollege.get(position);
holder.collegeTitle.setText(currentCollege.getTitle());
Date collegeCreatedOn=currentCollege.getCreatedOn();
if(collegeCreatedOn!=null){
String formattedDate=dateFormatter.format(collegeCreatedOn);
holder.collegeCreatedOn.setText(formattedDate);
}
else{
holder.collegeCreatedOn.setText(Constants.NA);
}
holder.collegeCity.setText(currentCollege.getCity());
holder.collegePhone.setText(currentCollege.getPhone());
String urlLogo = currentCollege.getUrlLogo();
loadImages(urlLogo, holder);
}
private void loadImages(String urlLogo, final ViewHolderCollege holder) {
if (!urlLogo.equals(Constants.NA)) {
imageLoader.get(urlLogo, new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
holder.collegeLogo.setImageBitmap(response.getBitmap());
}
@Override
public void onErrorResponse(VolleyError error) {
}
});
}
}
@Override
public int getItemCount() {
return listCollege.size();
}
static class ViewHolderCollege extends RecyclerView.ViewHolder {
ImageView collegeLogo;
TextView collegeTitle;
TextView collegeCreatedOn;
TextView collegePhone;
TextView collegeCity;
public ViewHolderCollege(View itemView) {
super(itemView);
collegeLogo = (ImageView) itemView.findViewById(R.id.collegeLogo);
collegeTitle = (TextView) itemView.findViewById(R.id.collegeTitle);
collegeCreatedOn = (TextView) itemView.findViewById(R.id.collegeCreatedOn);
collegePhone = (TextView) itemView.findViewById(R.id.collegePhone);
collegeCity = (TextView) itemView.findViewById(R.id.collegeCity);
}
}
pojo 类 => College.java:
public class College {
private long id;
private String title;
private Date createdOn;
private String phone;
private String city;
private String urlLogo;
public College(){
}
public College(long id,
String title,
Date createdOn,
String phone,
String city,
String urlLogo){
this.id=id;
this.title=title;
this.createdOn=createdOn;
this.phone=phone;
this.city=city;
this.urlLogo=urlLogo;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Date getCreatedOn() {
return createdOn;
}
public void setCreatedOn(Date createdOn) {
this.createdOn = createdOn;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getUrlLogo() {
return urlLogo;
}
public void setUrlLogo(String urlLogo) {
this.urlLogo = urlLogo;
}
@Override
public String toString() {
return "ID: "+id+
"Title "+title+
"Date "+createdOn+
"Phone "+phone+
"City "+city+
"urlLogo "+urlLogo+
"\n";
}
}
网络类 => VolleySingleton.java:
public class VolleySingleton {
private static VolleySingleton sInstance = null;
private ImageLoader mImageLoader;
private RequestQueue mRequestQueue;
private VolleySingleton() {
mRequestQueue = Volley.newRequestQueue(MyApplication.getAppContext());
mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
private LruCache<String, Bitmap> cache = new LruCache<>((int) (Runtime.getRuntime().maxMemory() / 1024) / 8);
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
public static VolleySingleton getInstance() {
if (sInstance == null) {
sInstance = new VolleySingleton();
}
return sInstance;
}
public RequestQueue getRequestQueue() {
return mRequestQueue;
}
public ImageLoader getImageLoader(){
return mImageLoader;
}