简体   繁体   中英

RecyclerView from JSON Array fetched from API

i have problem with showing some data that fetched from an API to a RecyclerView into a Tabbed Activity Fragment. First of all there is an Error:

E/RecyclerView﹕ No adapter attached; skipping layout  

Here are my codes, classes and layout:

Here is the Fragment 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);
    }
}  

Here is the Adapter 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);
    }


}  

Heres is the Getter and Setter RegEndaneredItem :

public class RegEndaneredItem {

private String mName;

public String getName() {
    return mName;
}

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

And at last here is the Layout 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>

Set an adapter with an empty list in onActivityCreated .

List<RegEndaneredItem> myItems = new ArrayList<RegEndaneredItem>();
myAdapter = new RegGridAdapter(myItems);
myRecyclerView.setAdapter(myAdapter);

Also check that your myItems list in RegPicsFragment is not null.

I didn't see your initialization of myItems .

EDIT

 myItems.add((RegEndaneredItem) myItems); 

This line doesn't make any sense. You have to set values to the object of RegEndaneredItem and add it to your list.

RegEndaneredItem reg = new RegEndaneredItem();
reg.setName(name);//calling Your SetterMethod
myItems.add(reg); 

Maybe my answer is slightly off topic, but if you want to reduce code complexity you can use this library instead Android RESTAdapter

It is really simple to implement and works like a charm everytime.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM