2016-04-18 15 views
-1

Ich hole Daten von Webservices, als ich diese Daten in einer RecyclerView zeigen muss ... Ich setze meine RecyclerView in einem OnPostExecute von AsyncTask, weil ich zuerst Daten holen muss. Problem ist, dass es keine Ansicht in meiner Tätigkeit ist, jedes Mal, wenn ich diese Nachricht erhielt ...
hier ist mein Main_activity ...RecyclerView: Kein Adapter angeschlossen; Layout überspringen?

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(); 
     } 
    } 
} 

Das ist meine Dataadapter Klasse ...

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

Sehr verwirrend ... Ihr onPostExecute gibt 'Void aVoid' zurück ... Also, was Arraylist in dieser Codezeile verwendet:' dataAdapter = new DataAdapter (arrayList); 'in onPostExecute Methode? Ihre Array-Liste ist leer ...? –

+0

Ich habe meinen vollständigen Aktivitätscode eingefügt ... – Zombie

+0

versuche, diese Zeile zu verschieben: 'new Connection(). Execute();' nach 'dataAdapter = neuer DataAdapter (arrayList);' in 'onCreate()' - das könnte der sein Problem. Wenn Sie jedoch die Bildschirmdrehung nicht deaktivieren, drehen Sie den Bildschirm, während Sie die AsyncTask ausführen. besser, eine Logik zu machen wie: 'if (savedInstanceState == null)' oder etwas Ähnliches. Wie bereits erwähnt, initialisiere deinen Recorper-View-Adapter einmal und rufe 'dataAdapter.notifyDataSetChanged()' auf, wenn du deine Arraylist-Daten änderst . –

Antwort

1

Der Code ist in mehrfacher Hinsicht schlecht. Wenn Sie jedes Mal, wenn Sie die Daten abrufen, einen neuen Adapter einrichten, ist kein Aufruf für notifyDataSetChanged() erforderlich. Aber in der Tat, was Sie lieber tun sollten stattdessen ist ersetzen Sie die Daten, nicht den Adapter und dann einfach anrufen dataAdapter.notifyDataSetChanged(); auf vorhandenen Adapter, damit es wissen, Daten hat sich geändert.

+0

Ich habe Ihre Antwort verstanden, aber nach dem Entfernen von notifyDataSetChanged() habe ich immer noch diese Nachricht und noch keine Ansicht in meiner Aktivität ... – Zombie

+0

Sie sollten Ihre Recycler-Ansicht in onCreate/onCreateView einrichten. Wenn Sie keine Daten erhalten haben, ist Ihr Adapter "leer". Aber es wird da sein und der Recycler wird sich nicht beschweren. Außerdem würde ich vorschlagen, stattdessen neue Adapter zu erstellen. –

+0

Ich habe meine recyclerView in onCreate initialisiert, aber ich kann recyclerView nicht in onCreate einrichten, ich muss auf webService response warten ... – Zombie

Verwandte Themen