2016-09-29 3 views
1

Meine RecyclerView zeigt nicht die Artikel Ansichten und nicht warum, und ich bin in der Lage, die Daten vom Server zu bekommen, aber die RecyclerView ist einfach nicht bevölkert meine Daten mit dem ui.RecyclerView nicht anzeigen Ansichten, wenn ich ein echtes Telefon, aber auf Emulator funktioniert es gut

Hier ist meine Adapter Klasse, die die itemviews mit den Daten bindet:

public class AdapterBooking extends   RecyclerView.Adapter<RecyclerView.ViewHolder> { 

private Context context; 
private LayoutInflater inflater; 
List<Booking> data= Collections.emptyList(); 
Booking current ; 

public AdapterBooking(Context context,List<Booking> data) { 

    this.context = context; 
    this.inflater= LayoutInflater.from(context); 
    this.data = data; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view=inflater.inflate(R.layout.containerbookings, parent,false); 
    MyHolder holder=new MyHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    MyHolder myHolder = (MyHolder) holder; 
    current = data.get(position); 

    myHolder.txtAccommoName.setText(current.AccommoName); 
    myHolder.txtBookingDate.setText("Booking Date: " + current.BookingDate); 
    myHolder.txtBookingExpiry.setText("Booking Expiry: " + current.BookingDuration); 
    myHolder.txtBookngStatus.setText("Status " + current.AccredStatus); 
    myHolder.txtBookngStatus.setTextColor(ContextCompat.getColor(context, R.color.colorAccent)); 

    Glide.with(context).load(R.drawable.the_yard_room) 
      .placeholder(R.drawable.ic_img_error) 
      .error(R.drawable.ic_img_error) 
      .into(myHolder.img); 
} 

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

class MyHolder extends RecyclerView.ViewHolder { 


    TextView txtAccommoName; 
    ImageView img; 
    TextView txtBookingDate; 
    TextView txtBookingExpiry; 
    TextView txtBookngStatus; 
    BootstrapButton btnCancel; 

    public MyHolder(View itemView) { 
     super(itemView); 

     txtAccommoName = (TextView)itemView.findViewById(R.id.textBookedAccommoName); 
     img= (ImageView) itemView.findViewById(R.id.imageBookedAccomo); 
     txtBookingDate = (TextView)itemView.findViewById(R.id.txtBookingDate); 
     txtBookingExpiry = (TextView)itemView.findViewById(R.id. txtBookingExpiry); 
     txtBookngStatus = (TextView)itemView.findViewById(R.id.txtBookingStatus); 
     btnCancel = (BootstrapButton)itemView.findViewById(R.id. btnCancelBookings); 

    } 

Hier meine Aktivitätsklasse ist, die die Daten vom Server bekommt:

public class BookingList extends AppCompatActivity { 
List<Booking> data; 
Booking booking; 
RecyclerView recyclerViewBooking; 
AdapterBooking mAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_booking_list); 

    new Connect().execute(); 
} 


private class Connect extends AsyncTask<String,String,String> 
{ 
    ProgressDialog load; 
    HttpURLConnection connection = null; 
    URL url = null; 
    String http = null; 

    SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(BookingList.this); 
    int studID = settings.getInt("STUDENT_ID_BOOKING",0); 

    public Connect() { 

     load = new ProgressDialog(BookingList.this); 

    } 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     load.setMessage("Loading..."); 
     load.setCancelable(false); 
     load.show(); 

    } 

    @Override 
    protected String doInBackground(String... params) { 

     http = "http://192.168.42.197:5432/WCF/BookingServices.svc/getAllBookingsByStud/"+studID; 
     try { 
      url = new URL(http); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 

     try { 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.setReadTimeout(15000); 
      connection.setConnectTimeout(10000); 
      connection.setRequestMethod("GET"); 
      connection.setRequestProperty("Accept", "Application/json"); 
      connection.setDoInput(true); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      int code = connection.getResponseCode(); 

      System.out.println("Response: " + code); 
      if(code ==HttpURLConnection.HTTP_OK) 
      { 
       InputStream input = connection.getInputStream(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
       StringBuilder result = new StringBuilder(); 
       String line = null; 

       while((line=reader.readLine()) != null) 
       { 
        result.append(line); 
       } 
       System.out.println(result.toString()); 

       return (result.toString()); 

      }else { 
       return("Unsuccessful"); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
      return e.toString(); 
     }finally { 
      connection.disconnect(); 
     } 


    } 

    @Override 
    protected void onPostExecute(String result) { 

     load.dismiss(); 
     load.dismiss(); 
     data= new ArrayList<>(); 
     try { 

      JSONArray jsonArray = new JSONArray(result); 
      for (int i = 0; i < jsonArray.length();i++) 
      { 
       JSONObject jsonObject = jsonArray.getJSONObject(i); 
       JSONObject object = jsonObject.getJSONObject("Accommodation"); 
       JSONObject objectStudent = jsonObject.getJSONObject("Student"); 

       booking = new Booking(); 

       booking.Name = objectStudent.getString("Name"); 
       booking.Surname = objectStudent.getString("Surname"); 
       booking.StudentNumber = objectStudent.getInt("StudentNumber"); 
       booking.AccommoName = object.getString("AccommoName"); 
       booking.AccredStatus = object.getString("AccredStatus"); 
       booking.BookingDate = jsonObject.getString("BookingDate"); 
       booking.BookingDuration = jsonObject.getString("BookingDuration"); 
       booking.BookingStatus = jsonObject.getString("BookingStatus"); 

       data.add(booking); 
      } 

      recyclerViewBooking = (RecyclerView)findViewById(R.id.listOfbooks); 
      mAdapter = new AdapterBooking(BookingList.this,data); 
      recyclerViewBooking.setAdapter(mAdapter); 
      recyclerViewBooking.setLayoutManager(new LinearLayoutManager(BookingList.this)); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      Toast.makeText(BookingList.this, e.toString(), Toast.LENGTH_LONG).show(); 
     } 


    } 
} 

}

+0

Sie sollten Ihren Adapter verlängern 'RecyclerView.Adapter ' – adnbsr

+0

Es wird hilfreich sein, wenn Sie ein Protokoll in den Adapterkonstruktor einfügen und die Datengröße drucken können. Ist es möglich, dass das JSON-Array leer ist? – greenrobo

+0

Nein, wenn das JSON-Array leer war, erhalte ich eine Null-Ausnahme –

Antwort

0

Remove dies:

MyHolder myHolder = (MyHolder) holder; 

Statt dies tun:, weil ich denke, es gibt keine Notwendigkeit, einen anderen Halter Bezug zu erhalten ist, wenn Sie es bereits auf onBindViewHolder (..) Methode

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

    current = data.get(position); 

    holder.txtAccommoName.setText(current.AccommoName); 
    holder.txtBookingDate.setText("Booking Date: " + current.BookingDate); 
    holder.txtBookingExpiry.setText("Booking Expiry: " + current.BookingDuration); 
    holder.txtBookngStatus.setText("Status " + current.AccredStatus); 
    holder.txtBookngStatus.setTextColor(ContextCompat.getColor(context, R.color.colorAccent)); 

    Glide.with(context).load(R.drawable.the_yard_room) 
      .placeholder(R.drawable.ic_img_error) 
      .error(R.drawable.ic_img_error) 
      .into(holder.img); 
} 

dies bitte versuchen Sie es und lass es mich wissen, dass es, wenn ändert alles für dich.

EDIT: Wie bereits von @adnbsr aus als auch in seinen Kommentaren Sie dies auch überprüfen müssen, weil es falsch stattdessen fühlt man diese

extends RecyclerView.Adapter<AdapterBooking.MyHolder> 
+0

Hat nicht funktioniert der Halter kann txt nicht auflösen ... –

+0

Haben Sie Ihren Adapter richtig verlängert? als AdapterBooking.Holder? –

+0

kein Glück hat nicht funktioniert –

0

Ihr Layout-Check gemacht haben sollte, stellen Sie sicher, dass Ihre RecyclerView ist kein Kind von ScrollView. Wenn Sie das brauchen, können Sie NestedScrollView verwenden.

Wenn Sie einen Haltepunkt erstellen, funktioniert Ihr onBindViewHolder?

Eine andere Sache, yo versuchen:

Es gibt eine RecyclerView Methode: setHasStableIds (boolean).

@Override 
public void setHasStableIds(boolean hasStableIds) { 
    return false; 
} 

Außerdem glaube ich, der Kontext ist falsch:

In Aktivität:

private Activity getActivity { 
    return this; 
} 

In AsyncTask:

mAdapter = new AdapterBooking(getActivity().getApplicationContext(),data); 

ich diese Informationen Hilfe hoffen, dass Sie.

Viel Glück.

+0

Kein Glück keine Änderungen –

+0

Und ... Aufblasen der Ansicht wie folgt: view = LayoutInflater.from (parent.getContext()) aufpumpen (R.layout.item, Elternteil, falsch); – alextfos

0

Das Problem wurde behoben. Ich verwende die gemeinsame Präferenz zum Speichern von Daten, also habe ich den falschen Schlüssel verwendet, um einen Wert aus der gemeinsamen Präferenz zu erhalten, der zuvor bewirkt hat, dass der gemeinsame Präferenzwert auf Null initialisiert wurde.

Verwandte Themen