2015-08-30 2 views
0

Я новичок в обращении. Это пример кода для моего RecycerView. Я получаю данные из Интернета и в onPostExecute() Я установил адаптер.Не прилагается адаптер; пропуская макет при использовании RecyclerView

RecyclerView recycle; 
MyAdapter adapters; 
private static String url; 
private static final String TAG_CONTACTS = "contacts"; 
JSONArray contacts = null; 
ProgressDialog pDialog; 
private int preLast; 
int page = 0, in, to; 
Boolean loadmore = true; 
HashMap<String, String> item; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    url = "http://192.168.1.20/adres/getAds.php"; 

    recycle = (RecyclerView) findViewById(R.id.recycle); 
    recycle.setItemAnimator(new DefaultItemAnimator()); 

    new GetContacts().execute(); 

    final GestureDetector mGestureDetector = new GestureDetector(MainActivity.this, new GestureDetector.SimpleOnGestureListener() { 

     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 

    }); 

} 

private class GetContacts extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> { 
    Boolean goterr = false; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(MainActivity.this); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    @Override 
    protected ArrayList<HashMap<String, String>> doInBackground(Void... arg0) { 
     String jsonStr = Fun.getHtml(url); 
     Log.v("this", jsonStr); 
     ArrayList<HashMap<String, String>> dataC = new ArrayList<HashMap<String, String>>(); 

     if (jsonStr != null) { 
      try { 
       JSONObject jsonObj = new JSONObject(jsonStr); 
       contacts = jsonObj.getJSONArray(TAG_CONTACTS); 
       if (contacts.length() < 20) 
        loadmore = false; 

       for (int i = 0; i < contacts.length(); i++) { 
        JSONObject c = contacts.getJSONObject(i); 
        HashMap<String, String> contact = new HashMap<String, String>(); 
        contact.put("id", new String(c.getString("id").getBytes("ISO-8859-1"), "UTF-8")); 
        contact.put("name", new String(c.getString("name").getBytes("ISO-8859-1"), "UTF-8")); 
        dataC.add(contact); 
        dataC.add(contact); 
       } 
      } catch (JSONException e) { 
       Log.v("this", e.getMessage()); 
       goterr = true; 
      } catch (UnsupportedEncodingException e) { 
       Log.v("this", e.getMessage()); 
       goterr = true; 
      } 
     } else { 
      goterr = true; 
     } 
     return dataC; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<HashMap<String, String>> result) { 
     super.onPostExecute(result); 
     if (pDialog.isShowing() && pDialog != null) 
      pDialog.dismiss(); 

     if (!isCancelled() && goterr == false && result != null) { 
      if (adapters == null) { 
       adapters = new MyAdapter(MainActivity.this, result); 
       recycle.setAdapter(adapters); 
       recycle.setLayoutManager(new LinearLayoutManager(MainActivity.this)); 
      } else { 
       adapters.addAll(result); 
      } 
     } else { 
      //MyToast.makeText(MainActivity.this, DariGlyphUtils.reshapeText(MainActivity.this.getResources().getString(R.string.problemload))); 
     } 

    } 
} 

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { 
    private LayoutInflater inflater; 
    public ArrayList<HashMap<String, String>> list; 

    public MyAdapter(Context context, ArrayList<HashMap<String, String>> list) { 
     inflater = LayoutInflater.from(context); 
     this.list = list; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parrent, int i) { 
     View view = inflater.inflate(R.layout.customrow, parrent, false); 
     MyViewHolder holder = new MyViewHolder(view); 
     return holder; 
    } 

    public void addAll(ArrayList<HashMap<String, String>> result) { 
     if (this.list == null) { 
      this.list = result; 
     } else { 
      this.list.addAll(result); 
     } 
     notifyDataSetChanged(); 
    } 

    public HashMap<String, String> geting(int position) { 
     return list.get(position); 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder viewHolder, int position) { 
     item = list.get(position); 
     viewHolder.txt.setText(item.get("onvan")); 
    } 

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

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     TextView txt; 
     ImageView img; 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      itemView.setOnClickListener(this); 
      txt = (TextView) itemView.findViewById(R.id.txt); 
      img = (ImageView) itemView.findViewById(R.id.img); 
     } 

     @Override 
     public void onClick(View v) { 
      item = adapters.geting(getPosition()); 
      Log.v("this", "id " + item.get("id")); 
      /*Intent in=new Intent (FistActiivty.this,AdDetails.class); 
      in.putExtra("ad_id",item.get("id")); 
      startActivity(in)*/ 
      ; 

     } 
    } 
} 

после того как я запустить его, я получаю эту ошибку:

RecyclerView﹕ No adapter attached; skipping layout 

что не так с этим кодом?

ответ

1

Проблема в том, что во время первого прохода макета, пока ваш AsyncTask по-прежнему извлекает данные из сети, ваш RecyclerView не имеет адаптера.

Вы можете вместо этого прикрепить (пустой) адаптер в onCreate() и обновить данные адаптера в своем onPostExecute(). Просто убедитесь, что ваш адаптер правильно обрабатывает пустой набор данных.

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