来自 JSON 的 RecyclerView 从 API 获取数组
RecyclerView from JSON Array fetched from API
我无法将一些从 API 获取到 RecyclerView 的数据显示到选项卡式 Activity 片段中。首先有一个错误:
E/RecyclerView﹕ No adapter attached; skipping layout
这是我的代码,类 和布局:
这是片段 RegPicsFragment
:
public class RegPicsFragment extends Fragment {
ProgressBar progressBar;
View view;
RecyclerView myRecyclerView;
RecyclerView.LayoutManager myLayoutManager;
RecyclerView.Adapter myAdapter;
List<RegEndaneredItem> myItems;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.frag_regpics, container ,false);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FontChangeCrawler fontChanger = new FontChangeCrawler(getActivity().getAssets(), "iransans.ttf");
fontChanger.replaceFonts((ViewGroup) this.getView());
progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
myRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view2);
myRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
myLayoutManager = new GridLayoutManager(view.getContext(), 1);
myRecyclerView.setLayoutManager(myLayoutManager);
}
class RetrieveFeedTask extends AsyncTask<Void, Void, String> {
private Exception exception;
protected void onPreExecute() {
progressBar.setVisibility(View.VISIBLE);
}
protected String doInBackground(Void... urls) {
try {
URL url = new URL("http://jsonplaceholder.typicode.com/users");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
bufferedReader.close();
return stringBuilder.toString();
}
finally{
urlConnection.disconnect();
}
}
catch(Exception e) {
Log.e("ERROR", e.getMessage(), e);
return null;
}
}
protected void onPostExecute(String response) {
if(response == null) {
response = "THERE WAS AN ERROR";
}
progressBar.setVisibility(View.GONE);
try {
JSONArray data = new JSONArray(response);
for(int i=0; i< data.length(); i++) {
String name = data.getJSONObject(i).getString("name");
Log.i("milad", name);
myItems.add((RegEndaneredItem) myItems);
}
} catch (JSONException e) {
e.printStackTrace();
}
myAdapter = new RegGridAdapter(myItems);
myRecyclerView.setAdapter(myAdapter);
}
}
这是适配器 RegGridAdapter
:
public class RegGridAdapter extends RecyclerView.Adapter<RegGridAdapter.ViewHolder> {
List<RegEndaneredItem> myItems;
public RegGridAdapter(List<RegEndaneredItem> myItems) {
this.myItems = myItems;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.reg_grid_item, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
RegEndaneredItem nature = myItems.get(i);
viewHolder.tvspecies.setText(nature.getName());
}
@Override
public int getItemCount() {
return myItems.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
public TextView tvspecies;
public ViewHolder(View itemView) {
super(itemView);
tvspecies = (TextView)itemView.findViewById(R.id.tv_species);
FontChangeCrawler fontChanger = new FontChangeCrawler(itemView.getContext().getAssets(), "iransans.ttf");
fontChanger.replaceFonts((ViewGroup) itemView);
}
}
这是 Getter 和 Setter RegEndaneredItem
:
public class RegEndaneredItem {
private String mName;
public String getName() {
return mName;
}
public void setName(String name) {
this.mName = name;
}
最后是布局 frag_regpics
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view2"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true"
android:layout_centerHorizontal="true"
android:visibility="gone" />
</LinearLayout>
在 onActivityCreated
中设置一个带有空列表的适配器。
List<RegEndaneredItem> myItems = new ArrayList<RegEndaneredItem>();
myAdapter = new RegGridAdapter(myItems);
myRecyclerView.setAdapter(myAdapter);
还要检查 RegPicsFragment
中的 myItems
列表是否为空。
我没有看到你对 myItems
的初始化。
编辑
myItems.add((RegEndaneredItem) myItems);
这一行没有任何意义。您必须为 RegEndaneredItem
的对象设置值并将其添加到列表中。
RegEndaneredItem reg = new RegEndaneredItem();
reg.setName(name);//calling Your SetterMethod
myItems.add(reg);
也许我的回答有点跑题了,但是如果你想降低代码的复杂性,你可以改用这个库Android RESTAdapter
实施起来真的很简单,而且每次都很有魅力。
我无法将一些从 API 获取到 RecyclerView 的数据显示到选项卡式 Activity 片段中。首先有一个错误:
E/RecyclerView﹕ No adapter attached; skipping layout
这是我的代码,类 和布局:
这是片段 RegPicsFragment
:
public class RegPicsFragment extends Fragment {
ProgressBar progressBar;
View view;
RecyclerView myRecyclerView;
RecyclerView.LayoutManager myLayoutManager;
RecyclerView.Adapter myAdapter;
List<RegEndaneredItem> myItems;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.frag_regpics, container ,false);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
FontChangeCrawler fontChanger = new FontChangeCrawler(getActivity().getAssets(), "iransans.ttf");
fontChanger.replaceFonts((ViewGroup) this.getView());
progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
myRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view2);
myRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
myLayoutManager = new GridLayoutManager(view.getContext(), 1);
myRecyclerView.setLayoutManager(myLayoutManager);
}
class RetrieveFeedTask extends AsyncTask<Void, Void, String> {
private Exception exception;
protected void onPreExecute() {
progressBar.setVisibility(View.VISIBLE);
}
protected String doInBackground(Void... urls) {
try {
URL url = new URL("http://jsonplaceholder.typicode.com/users");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
bufferedReader.close();
return stringBuilder.toString();
}
finally{
urlConnection.disconnect();
}
}
catch(Exception e) {
Log.e("ERROR", e.getMessage(), e);
return null;
}
}
protected void onPostExecute(String response) {
if(response == null) {
response = "THERE WAS AN ERROR";
}
progressBar.setVisibility(View.GONE);
try {
JSONArray data = new JSONArray(response);
for(int i=0; i< data.length(); i++) {
String name = data.getJSONObject(i).getString("name");
Log.i("milad", name);
myItems.add((RegEndaneredItem) myItems);
}
} catch (JSONException e) {
e.printStackTrace();
}
myAdapter = new RegGridAdapter(myItems);
myRecyclerView.setAdapter(myAdapter);
}
}
这是适配器 RegGridAdapter
:
public class RegGridAdapter extends RecyclerView.Adapter<RegGridAdapter.ViewHolder> {
List<RegEndaneredItem> myItems;
public RegGridAdapter(List<RegEndaneredItem> myItems) {
this.myItems = myItems;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.reg_grid_item, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(v);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
RegEndaneredItem nature = myItems.get(i);
viewHolder.tvspecies.setText(nature.getName());
}
@Override
public int getItemCount() {
return myItems.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
public TextView tvspecies;
public ViewHolder(View itemView) {
super(itemView);
tvspecies = (TextView)itemView.findViewById(R.id.tv_species);
FontChangeCrawler fontChanger = new FontChangeCrawler(itemView.getContext().getAssets(), "iransans.ttf");
fontChanger.replaceFonts((ViewGroup) itemView);
}
}
这是 Getter 和 Setter RegEndaneredItem
:
public class RegEndaneredItem {
private String mName;
public String getName() {
return mName;
}
public void setName(String name) {
this.mName = name;
}
最后是布局 frag_regpics
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view2"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true"
android:layout_centerHorizontal="true"
android:visibility="gone" />
</LinearLayout>
在 onActivityCreated
中设置一个带有空列表的适配器。
List<RegEndaneredItem> myItems = new ArrayList<RegEndaneredItem>();
myAdapter = new RegGridAdapter(myItems);
myRecyclerView.setAdapter(myAdapter);
还要检查 RegPicsFragment
中的 myItems
列表是否为空。
我没有看到你对 myItems
的初始化。
编辑
myItems.add((RegEndaneredItem) myItems);
这一行没有任何意义。您必须为 RegEndaneredItem
的对象设置值并将其添加到列表中。
RegEndaneredItem reg = new RegEndaneredItem();
reg.setName(name);//calling Your SetterMethod
myItems.add(reg);
也许我的回答有点跑题了,但是如果你想降低代码的复杂性,你可以改用这个库Android RESTAdapter
实施起来真的很简单,而且每次都很有魅力。