2017-03-16 54 views
0

我一直在试图让我的RecyclerView工作,但我不能得到任何东西显示在卡上,并且CycleTrails类不运行,因为Logcat不显示任何通过类的日志设置...在设置适配器之前,一切正常,我可以从我的CycleTrails类中获取所有的值。但现在,事情搞砸了,我找不出原因。为什么我的recyclerview适配器不起作用? /为什么班级没有运行?

MainActivity.java(所述的onCreate部分/只我添加与适配器的东西)

@Override 
protected void onCreate(Bundle savedInstanceState) { 


    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    rvItem = (RecyclerView) findViewById(R.id.rvItem); 
    rvItem.setHasFixedSize(true); 
    LinearLayoutManager manager = new LinearLayoutManager(this); 
    rvItem.setLayoutManager(manager); 
    ArrayList<Trails> finalData = getTrails(); 
    Adapter adapter = new Adapter(this, finalData); 
    rvItem.setAdapter(adapter); 

CycleTrails.java

public class CycleTrails extends MainActivity { 

public static double LAT_MAX = myLatitude + (0.01 * 200); 
public static double LAT_MIN = myLatitude - (0.01 * 200); 
public static double LON_MAX = myLongitude + (0.01 * 200); 
public static double LON_MIN = myLongitude - (0.01 * 200); 

public static ArrayList<Trails> getTrails() { 
    Log.d("trails", "Cycle trails running"); 
    ArrayList<Trails> trailList = new ArrayList<>(); 
    Trails t1 = new Trails(51.71, -3.36, "Bike Park Wales", "", "", ""); 
    Trails t2 = new Trails(51.66, -3.35, "Mountain Ash", "", "", ""); 
    Trails t3 = new Trails(50.50, -4.17, "FlyUp Downhill", "", "", ""); 
    trailList.add(t1); 
    trailList.add(t2); 
    trailList.add(t3); 


    final ArrayList<Trails> localTrails = new ArrayList<>(); 
    for (final Trails trail : trailList) { 
     Log.d("List running", "Local trail list"); 
     if (trail.lat > LAT_MIN && trail.lat < LAT_MAX && trail.lon > LON_MIN && trail.lon < LON_MAX) { 
      localTrails.add(trail); 
      Log.d("Calc", "Run code"); 


      final RequestBuilder weather = new RequestBuilder(); 

      final Request request = new Request(); 
      request.setLat(String.valueOf(trail.lat)); 
      Log.d("Lat used", String.valueOf(trail.lat)); 
      Log.d("Actual Lat", request.getLat()); 
      request.setLng(String.valueOf(trail.lon)); 
      Log.d("Lon used", String.valueOf(trail.lon)); 
      request.setUnits(Request.Units.UK); 
      request.setLanguage(Request.Language.ENGLISH); 
      request.addExcludeBlock(Request.Block.CURRENTLY); 
      request.removeExcludeBlock(Request.Block.CURRENTLY); 


      weather.getWeather(request, new Callback<WeatherResponse>() { 
       @Override 
       public void success(WeatherResponse weatherResponse, Response response) { 
        Log.d("Weather", "We have weather!"); 
        Log.d("Location", weatherResponse.getTimezone()); 
        trail.temp = String.valueOf(weatherResponse.getCurrently().getTemperature()); 
        Log.d("Temperature", trail.temp); 
        trail.weather = weatherResponse.getCurrently().getIcon(); 
       } 

       @Override 
       public void failure(RetrofitError retrofitError) { 
        Log.d("Error while calling: ", "Weather"); 
       } 


      }); 
     } else { 
      Log.d("Too far", "Trails too far" + trail.name); 
     } 
    } 
    return localTrails; 
} 

} 

适配器

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> { 
private Context context; 
public ArrayList <Trails> finalData; 

public Adapter (Context context, ArrayList<Trails> finalData) { 
    Log.d("Hello", "Adapter"); 
    this.context = context; 
    this.finalData = finalData; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    Log.d("Hello", "2"); 
    View view = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.trail_card, parent, false); 
    ViewHolder viewHolder = new ViewHolder(view); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    Trails trails = finalData.get(position); 
    Log.d("Hello", "3"); 
    Picasso.with(context) 
      .load("http://www.wigglestatic.com/product-media/5360108808/Wiggle-Road-Bike-Road-Bikes-Black-1WGMY16R7048UK0001-6.jpg?w=2000&h=2000&a=7") 
      .placeholder(R.drawable.cycle) 
      .error(android.R.drawable.stat_notify_error) 
      .into(holder.locationImage); 
    holder.locationText.setText(trails.name); 
    Log.d("Location", trails.name); 
    holder.temperatureText.setText(trails.temp); 
    Log.d("Temperature", trails.temp); 
    holder.weatherText.setText(trails.weather); 
    holder.conditionsText.setText(trails.conditions); 
} 

@Override 
public int getItemCount() { 
    Log.d("Hello", "4"); 
    if(finalData != null) { 
     Log.d("Hello", "5"); 
     return finalData.size(); 
    } 
    return 0; 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 

    public CardView cardView; 
    public ImageView locationImage; 
    public TextView locationText; 
    public TextView temperatureText; 
    public TextView weatherText; 
    public TextView conditionsText; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     cardView = (CardView)itemView.findViewById(R.id.cardView); 
     locationImage = (ImageView)itemView.findViewById(R.id.locationImage); 
     locationText = (TextView)itemView.findViewById(R.id.locationText); 
     temperatureText = (TextView)itemView.findViewById(R.id.temperatureText); 
     weatherText = (TextView)itemView.findViewById(R.id.weatherText); 
     conditionsText = (TextView)itemView.findViewById(R.id.conditionsText); 
    } 
} 
} 

Trails.java

public class Trails { 
public String name; 
public double lat; // Object fields 
public double lon; 
public String temp; 
public String weather; 
public static String conditions; 


Trails(double lat, double lon, String name, String temp, String weather, String conditions){ // construcor 
    this.lat = lat; 
    this.lon = lon; 
    this.name = name; 
    this.temp = temp; 
    this.weather = weather; 
    this.conditions = conditions; 
} 
} 

这是运行

03-16 10:32:48.877 20535-20535/com.example.android.cycleuk D/Lat: 52.1981981981982 
03-16 10:32:48.877 20535-20535/com.example.android.cycleuk D/Lon: -2.2341297062250933 
03-16 10:33:19.859 20535-20542/com.example.android.cycleuk W/art: Suspending all threads took: 10.141ms 
03-16 10:33:19.956 20535-20535/com.example.android.cycleuk D/Hello: Adapter 
03-16 10:33:20.023 20535-20535/com.example.android.cycleuk D/Hello: 4 
03-16 10:33:20.023 20535-20535/com.example.android.cycleuk D/Hello: 4 
03-16 10:33:20.069 20535-20535/com.example.android.cycleuk D/Lat: 52.1981981981982 
03-16 10:33:20.069 20535-20535/com.example.android.cycleuk D/Lon: -2.2341297062250933 
+2

您是否将适配器与Recycleview绑定? –

+0

检查'finalData'是否为空。 –

+0

@JdPrajapati yep我认为是的,我将它绑定在MainActivity上? – RazerB12

回答

1

绑定您的适配器与recycleview整个应用程序的logcat的..

ArrayList<Trails> finalData = getTrails(); 
Adapter adapter = new Adapter(this, finalData); 
rvItem.setAdapter(adapter) 
+0

啊好吧,我应该把这个放在哪里? – RazerB12

+0

看到第一行...把它放在你的oncreate中 –

+0

这是行不通的,因为'''getTrails()'''不是同步调用 –

0

我认为你必须改变你的适配器类slightly.First 你必须将Adapter添加到您的recyclerView.Please确保recyclerView使用布局管理器初始化,而不是null。

Adapter adapter = new Adapter(this); 
rvItem.setAdapter(adapter); 

这里我们适配器类implementation.You必须创建适配器类的内部列表中。

public class Adapter { 

ArrayList<Trails> finalData; 
Context context; 

public Adapter(Context context){ 
    this.context = context; 
    finalData = new ArrayList<>(); 
} 

..... 

.... 

public void addItem(Trails data){ 
    finalData.add(data); 
    notifyDataSetChanged(); // Note this method is important because it will let adapter know size of list changed and render the list 
} 

} 

在您的片段或活动类添加方法

Adapter adapter = new Adapter(this); 
rvItem.setAdapter(adapter); 

/// here your methods what ever you want 

dataList = getTrails(); 
for(Trails trails: dataList){ 
    adapter.addItem(trails); 
} 

我希望这会帮助你。

+0

Cheedd buddy!但是,实施您的修补程序并不会帮助。 notifyItemDataSetChanged();从未被事先声明为方法?此外,dataList应该是finalData? – RazerB12

+0

对不起,它必须是notifyDataSetChanged(); –

+0

它工作与否请让我知道? –

0
I think your getTrails method always return size 0 list that why you never get anything in recyclerview. All code is working fine . just check your code that you get any data in your list before setting it into recyclerview. 



public static ArrayList<Trails> getTrails() { 
    Log.d("trails", "Cycle trails running"); 
    ArrayList<Trails> trailList = new ArrayList<>(); 
    Trails t1 = new Trails(51.71, -3.36, "Bike Park Wales", "", "", ""); 
    Trails t2 = new Trails(51.66, -3.35, "Mountain Ash", "", "", ""); 
    Trails t3 = new Trails(50.50, -4.17, "FlyUp Downhill", "", "", ""); 
    trailList.add(t1); 
    trailList.add(t2); 
    trailList.add(t3); 


    final ArrayList<Trails> localTrails = new ArrayList<>(); 
    for (final Trails trail : trailList) { 
     Log.d("List running", "Local trail list"); 
     if (trail.lat > LAT_MIN && trail.lat < LAT_MAX && trail.lon > LON_MIN && trail.lon < LON_MAX) { 
      localTrails.add(trail); 
      Log.d("Calc", "Run code"); 


      final RequestBuilder weather = new RequestBuilder(); 

      final Request request = new Request(); 
      request.setLat(String.valueOf(trail.lat)); 
      Log.d("Lat used", String.valueOf(trail.lat)); 
      Log.d("Actual Lat", request.getLat()); 
      request.setLng(String.valueOf(trail.lon)); 
      Log.d("Lon used", String.valueOf(trail.lon)); 
      request.setUnits(Request.Units.UK); 
      request.setLanguage(Request.Language.ENGLISH); 
      request.addExcludeBlock(Request.Block.CURRENTLY); 
      request.removeExcludeBlock(Request.Block.CURRENTLY); 


      weather.getWeather(request, new Callback<WeatherResponse>() { 
       @Override 
       public void success(WeatherResponse weatherResponse, Response response) { 
        Log.d("Weather", "We have weather!"); 
        Log.d("Location", weatherResponse.getTimezone()); 
        trail.temp = String.valueOf(weatherResponse.getCurrently().getTemperature()); 
        Log.d("Temperature", trail.temp); 
        trail.weather = weatherResponse.getCurrently().getIcon(); 
       } 

       @Override 
       public void failure(RetrofitError retrofitError) { 
        Log.d("Error while calling: ", "Weather"); 
       } 


      }); 
     } else { 
      Log.d("Too far", "Trails too far" + trail.name); 
     } 
    } 
    return localTrails; 
} 
0

weather.getWeather()不同步正确的?这可能会导致您的localTrails总是空的。也许你可以尝试把这个代码localTrails.add(trail)里面的success方法同步调用。

+0

谢谢,但整个CycleTrails类不运行,所以它甚至没有达到同步调用的成功方法 – RazerB12

+0

你解决了@ RazerB12吗? – jemsnaban