2016-10-05 3 views
0

мое приложение работает хорошо, но андроид студии дать мне 1message, а затем принять, что кажется RecyclerView не работает! это моя ошибка: RecyclerView: адаптер не прилагается; пропуская макетнет адаптера прилагается пропуская макет recyclerview в фрагменте

мой фрагмент:

public class news extends Fragment { 

    private RecyclerView recyclerView; 
    private ArrayList<Deatails> data; 
    private DataAdapter adapter; 
    private View myFragmentView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     myFragmentView = inflater.inflate(R.layout.news, container, false); 

     initViews(); 
     return myFragmentView; 
    } 

    private void initViews() { 
     recyclerView = (RecyclerView) myFragmentView.findViewById(R.id.card_recycler_view); 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); 
     recyclerView.setHasFixedSize(true); 
     recyclerView.setLayoutManager(layoutManager); 

     data = new ArrayList<Deatails>(); 
     adapter = new DataAdapter(getActivity(), data); 
     recyclerView.setAdapter(adapter); 



     new Thread() 
     { 
      public void run() 
      { 
       getActivity().runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         loadJSON(); 
        } 
       }); 

      } 
     } 
     .start(); 

    } 
//  Thread t = new Thread(new Runnable() { 
//   @Override 
//   public void run() { 
//    loadJSON(); 
//   } 
//  }); 
//  t.start(); 



    private void loadJSON() { 
     if (isNetworkConnected()){ 
      Retrofit retrofit = new Retrofit.Builder() 
        .baseUrl("http://memaraneha.ir") 
        .addConverterFactory(GsonConverterFactory.create()) 
        .build(); 
      RequestInterface request = retrofit.create(RequestInterface.class); 
      Call<JSONResponse> call = request.getJSON(); 
      final ProgressDialog progressDialog = new ProgressDialog(getActivity()); 
      progressDialog.show(); 
      call.enqueue(new Callback<JSONResponse>() { 
       @Override 
       public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) { 
        progressDialog.dismiss(); 
        JSONResponse jsonResponse = response.body(); 
        data.addAll(Arrays.asList(jsonResponse.getAndroid())); 
        adapter.notifyDataSetChanged(); 
       } 
       @Override 
       public void onFailure(Call<JSONResponse> call, Throwable t) { 
        progressDialog.dismiss(); 
        Log.d("Error", t.getMessage()); 
       } 
      }); 
     } 
     else { 
      Toast.makeText(getActivity().getApplicationContext(), "دستگاه شما به اینترنت متصل نیست!", Toast.LENGTH_LONG).show();} 
    } 
    private boolean isNetworkConnected() { 
     ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo ni = cm.getActiveNetworkInfo(); 
     if (ni == null) { 
      // There are no active networks. 
      return false; 
     } else 
      return true; 
    } 
} 

мой адаптер:

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> { 
    private Context context; 
    private ArrayList<Deatails> android; 


    public DataAdapter(Context context,ArrayList<Deatails> android) { 
     this.context = context; 
     this.android = android; 
    } 

    @Override 
    public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row, viewGroup, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(DataAdapter.ViewHolder viewHolder, final int i) { 

     viewHolder.tv_name.setText(android.get(i).getName()); 
     viewHolder.tv_version.setText(android.get(i).getVer()); 
     viewHolder.tv_api_level.setText(android.get(i).getApi()); 

     // load image into imageview using glide 
     Picasso.with(context).load("http://memaraneha.ir/Erfan/images/"+android.get(i).getPic()).resize(500,500) 
//    .placeholder(R.drawable.truiton) 
//    .error(R.drawable.truiton) 
       .into(viewHolder.tv_image); 

     viewHolder.tv_image.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Toast.makeText(context,"this is my pic",Toast.LENGTH_SHORT).show(); 

      } 
     }); 
    } 

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

    public class ViewHolder extends RecyclerView.ViewHolder{ 
     private TextView tv_name,tv_version,tv_api_level; 
     private ImageView tv_image; 


     public ViewHolder(View view) { 
      super(view); 

      tv_name = (TextView)view.findViewById(R.id.tv_name); 
      tv_version = (TextView)view.findViewById(R.id.tv_version); 
      tv_api_level = (TextView)view.findViewById(R.id.tv_api_level); 
      tv_image= (ImageView) view.findViewById(R.id.img); 
     } 
    } 
} 

RequestInterface:

+0

Сначала создайте адаптер и прикрепите данные к нему, когда он поступит. Наверное, для ответа сети и создания адаптера требуется некоторое время. – GoneUp

+0

im new in android if u want help me, пожалуйста, ответьте на мой вопрос и скажите мне, где следует менять коды. tnx – erfan

+0

Сначала посмотрите эту тему и следуйте ее ответам http://stackoverflow.com/questions/29141729/recyclerview-no-adapter-attached-skipping-layout – GoneUp

ответ

0

Возможное решение, как я уже писал ранее, чтобы создать адаптер первым и добавьте после этого сообщите об этом адаптеру. Я также добавил Runnable для loadJson(), чтобы предотвратить NetworkOnMainThreadException (может быть, эта модификация делает это сама по себе, но только для случая).

public class news extends Fragment { 

     private RecyclerView recyclerView; 
     private ArrayList<Deatails> data; 
     private DataAdapter adapter; 
     private View myFragmentView; 


     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      myFragmentView = inflater.inflate(R.layout.news, container, false); 
      initViews(); 
      return myFragmentView; 
     } 

     private void initViews() { 
      recyclerView = (RecyclerView)myFragmentView.findViewById(R.id.card_recycler_view); 
      RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); 
      recyclerView.setHasFixedSize(true); 
      recyclerView.setLayoutManager(layoutManager); 

data = new ArrayList<Deatails>(); 
adapter = new DataAdapter(getActivity(), data); 
      recyclerView.setAdapter(adapter); 

      Thread t = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        loadJSON(); 
       } 
      }); 
      t.start(); 
     } 
     private void loadJSON() { 
      if (isNetworkConnected()){ 
       Retrofit retrofit = new Retrofit.Builder() 
         .baseUrl("http://memaraneha.ir") 
         .addConverterFactory(GsonConverterFactory.create()) 
         .build(); 
       RequestInterface request = retrofit.create(RequestInterface.class); 
       Call<JSONResponse> call = request.getJSON(); 
       final ProgressDialog progressDialog = new ProgressDialog(getActivity()); 
       progressDialog.show(); 
       call.enqueue(new Callback<JSONResponse>() { 
        @Override 
        public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) { 
         progressDialog.dismiss(); 
         JSONResponse jsonResponse = response.body(); 
         data.addAll((Arrays.asList(jsonResponse.getAndroid())); 
         adapter.notifyDataSetChanged(); 
        } 
        @Override 
        public void onFailure(Call<JSONResponse> call, Throwable t) { 
         progressDialog.dismiss(); 
         Log.d("Error", t.getMessage()); 
        } 
       }); 
      } 
      else { 
       Toast.makeText(getActivity().getApplicationContext(), "دستگاه شما به اینترنت متصل نیست!", Toast.LENGTH_LONG).show();} 
     } 
     private boolean isNetworkConnected() { 
      ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo ni = cm.getActiveNetworkInfo(); 
      if (ni == null) { 
       // There are no active networks. 
       return false; 
      } else 
       return true; 
     } 
    } 
+0

У меня есть это исключение: news.DataAdapter.getItemCount (DataAdapter.java:60) и укажите из этой строки: return android.size(); в моем адаптере получить количество товаров – erfan

+0

Исправлено. Забыл инициализировать данные. – GoneUp

+0

java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare() – erfan

Смежные вопросы