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);
}
}
}
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 ...? –
Ich habe meinen vollständigen Aktivitätscode eingefügt ... – Zombie
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 . –