2016-09-29 53 views
1

我的recyclerView不显示项目视图,不要为什么,我能够从服务器获取数据,但recyclerView只是不用ui填充我的数据。RecyclerView不显示项目视图时,我使用实际的手机,但在仿真程序,它工作正常

这里是结合与数据itemviews我Adapter类:

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

    } 

这里是我的Activity类从服务器获取数据:

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

您应该扩展适配器'RecyclerView.Adapter ' – adnbsr

+0

如果您可以在适配器构造器中放置日志并打印数据大小,将会很有帮助。 JSON数组可能是空的吗? – greenrobo

+0

如果JSON数组为空,否则我将收到一个空例外 –

回答

0

删除此:

MyHolder myHolder = (MyHolder) holder; 

而是做到这一点:,因为我觉得没有必要让另一架参考,当你已经拥有了它onBindViewHolder(..)方法

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

试试这个,请和你让我知道,如果它改变你的任何事情。

编辑:正如@adnbsr以及在他的评论中指出的,你需要检查这个问题,以及因为感觉错了,而不是你应该做这个

extends RecyclerView.Adapter<AdapterBooking.MyHolder> 
+0

持有人无法解析txt ... –

+0

您是否正确扩展适配器?作为AdapterBooking.Holder? –

+0

没有运气没有工作 –

0

检查你的布局,请确保您的RecyclerView不是ScrollView的子项。如果你需要,你可以使用NestedScrollView。

如果你制作一个断点,你的onBindViewHolder的作品?

另一件事哟可以尝试:

有一个RecyclerView方法:setHasStableIds(布尔)。

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

另外,我觉得上下文是错误的:

在活动:

private Activity getActivity { 
    return this; 
} 

在的AsyncTask:

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

我希望这些信息对您有帮助。

祝你好运。

+0

没有运气没有变化 –

+0

And ...膨胀视图如下: view = LayoutInflater.from(parent.getContext ())。inflate(R.layout.item,parent,false); – alextfos

0

解决了这个问题。我使用共享首选项来存储数据,所以我使用了错误的键从共享首选项中获取一个值,之前导致sharedpreference值被初始化为零。