2016-04-18 4 views
-1

Я получаю данные от webservices, чем я должен показать эти данные в recyclerView ... Я устанавливаю свой recyclerView в onPostExecute AsyncTask, потому что мне нужно сначала получить данные. Проблема в том, что нет Смотреть в моей деятельности, каждый раз, когда я получил это сообщение ...
вот мой Main_activity ...RecyclerView: адаптер не прилагается; пропуская макет?

public class Store_Items_Display extends AppCompatActivity 
    { 
    public String s; 
    private RecyclerView recyclerView; 
    private DataAdapter dataAdapter; 
    private ArrayList<String> arrayList = new ArrayList<>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_store__items__display); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     recyclerView = (RecyclerView) findViewById(R.id.recycleView); 
     dataAdapter = new DataAdapter(arrayList); 
     Log.i("ArrayList size :::", String.valueOf(arrayList.size())); 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); 
     recyclerView.setHasFixedSize(true); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setAdapter(dataAdapter); 

     new Connection().execute(); 

     Intent intent = getIntent(); 
     Bundle bundle = intent.getExtras(); 
     if (bundle != null) 
     { 
      s = (String) bundle.get("userName"); 
      Log.i("Oncreate UserName ::: ", "Hamza"); 
     } 
     else 
     { 
      Log.i("Data in intent ::;", "is Null"); 
     } 

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 
     Button submitButton = (Button) findViewById(R.id.button8); 
     submitButton.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       Toast.makeText(Store_Items_Display.this, "Submitted", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 


    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     Intent myIntent = new Intent(getApplicationContext(), StoreFirstActivity.class); 
     startActivityForResult(myIntent, 0); 
     return true; 
    } 

    class Connection extends AsyncTask<Void, Void, Void> 
    { 
     StringBuilder result = new StringBuilder(); 
     final String TAG = "Items in ArrayList :::"; 

     @Override 
     protected void onPreExecute() 
     { 
      super.onPreExecute(); 
      Toast.makeText(Store_Items_Display.this, "Welcome", Toast.LENGTH_LONG); 
     } 

     @Override 
     protected Void doInBackground(Void... params) 
     { 
      try 
      { 
       Log.i("User Name ::: ", "Hamza"); 
       URL url = new URL("http://10.0.3.2/FixItApp/GetData.php?user_name=khan"); // need changes here... 
       HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection(); 
       InputStream in = new BufferedInputStream(httpUrlConnection.getInputStream()); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
       String line; 
       while ((line = reader.readLine()) != null) 
       { 
        result.append(line); 
       } 
       in.close(); 
       reader.close(); 
       if (!result.toString().equals("")) 
       { 
        JSONObject jsonObject = new JSONObject(result.toString()); 
        JSONArray jsonArray = new JSONArray(jsonObject.getString("user_data")); 
        for (int i = 0; i < jsonArray.length(); i++) 
        { 
         String serial = jsonArray.getJSONObject(i).getString("serial_number"); 
         String items = jsonArray.getJSONObject(i).getString("items"); 
         String brand = jsonArray.getJSONObject(i).getString("brand"); 
         String price = jsonArray.getJSONObject(i).getString("price"); 
         arrayList.add(serial); 
         arrayList.add(items); 
         arrayList.add(brand); 
         arrayList.add(price); 
         Log.i(TAG, serial); 
         Log.i(TAG, arrayList.toString()); 
         Log.i("ArrayList Size :::", String.valueOf(arrayList.size())); 
        } 
       } 
       else 
       { 
        Toast.makeText(Store_Items_Display.this, "No data found of this name", Toast.LENGTH_LONG); 
       } 
      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) 
     { 
      super.onPostExecute(aVoid); 
      dataAdapter.notifyDataSetChanged(); 
     } 
    } 
} 

Это мой DataAdapter класс ...

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.MyViewHolder> 
{ 
    private ArrayList<String> dataList; 

    public DataAdapter(ArrayList<String> arrayList) 
    { 
     this.dataList = arrayList; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    { 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.data_view, parent, false); 
     return new MyViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) 
    { 
     String items = dataList.get(position); 
     holder.serial.setText(items); 

    } 

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

    class MyViewHolder extends RecyclerView.ViewHolder 
    { 
     public TextView serial; 
     public TextView items; 
     public TextView brand; 
     public TextView price; 
     public MyViewHolder(View itemView) 
     { 
      super(itemView); 
      serial = (TextView) itemView.findViewById(R.id.serial); 
      items = (TextView) itemView.findViewById(R.id.items); 
      brand = (TextView) itemView.findViewById(R.id.brand); 
      price = (TextView) itemView.findViewById(R.id.price); 
     } 
    } 
} 
+0

Очень запутанный ... Ваш onPostExecute возвращает 'Void aVoid' ... Итак, какой арраист использует в этой строке кода:' dataAdapter = new DataAdapter (arrayList); 'in onPostExecute метод? Ваш список массивов пуст ...? –

+0

Я наклеил код своей полной активности ... – Zombie

+0

попробуйте переместить эту строку: 'new Connection(). Execute();' after' dataAdapter = new DataAdapter (arrayList); 'in' onCreate() '- это может быть вопрос. Однако, если вы не отключите вращение экрана, время, которое вы поворачиваете на экране, вы будете выполнять AsyncTask? лучше сделать некоторую логику, например: 'if (savedInstanceState == null)' или что-то подобное. Также, как указывалось ранее, инициализируйте адаптер просмотра recycler один раз и вызовите 'dataAdapter.notifyDataSetChanged()', когда вы меняете данные arraylist , –

ответ

1

Код плохо в двух путях. Если вы устанавливаете новый адаптер каждый раз, когда вы извлекаете данные, тогда нет никакого смысла для вызова notifyDataSetChanged(). Но на самом деле то, что вам следует скорее делать, - это заменить данные, а не адаптер, а затем просто позвонить dataAdapter.notifyDataSetChanged(); на существующий адаптер, чтобы он знал, что данные изменились.

+0

У меня есть undestand ваш ответ, но после удаления notifyDataSetChanged() у меня все еще есть этот msg и до сих пор не получил View в моей активности ... – Zombie

+0

Вы должны настроить просмотр своего recycler в onCreate/onCreateView. Если у вас нет данных, ваш адаптер будет «пустым». Но он будет там, и recycler не будет жаловаться. Также я бы предложил удалить вместо этого новые адаптеры. –

+0

Я инициализирую свой recyclerView в onCreate, но я не могу настроить recyclerView в onCreate, мне нужно ждать ответа webService ... – Zombie

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