Java RecyclerView未连接适配器;跳过布局(无法从前面的问题中解决)

Java RecyclerView未连接适配器;跳过布局(无法从前面的问题中解决),java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在尝试构建一个应用程序,该应用程序应该使用开放源代码的sport API来获取足球(足球)锦标赛列表,并将其显示在RecyclerView上,出于某种原因,我遇到了两个错误: 1-com.mad.footstats E/RecyclerView:未连接适配器;跳过布局 2-E/MainActivity:com.google.gson.stream.MalformedJsonException:使用JsonReader.setLenient(true)在第1行第1列路径接受格式错误的JSON$

我正在尝试构建一个应用程序,该应用程序应该使用开放源代码的sport API来获取足球(足球)锦标赛列表,并将其显示在RecyclerView上,出于某种原因,我遇到了两个错误:

1-com.mad.footstats E/RecyclerView:未连接适配器;跳过布局

2-E/MainActivity:com.google.gson.stream.MalformedJsonException:使用JsonReader.setLenient(true)在第1行第1列路径接受格式错误的JSON$

我无法从之前对相同问题的回答中得出结论,因此请您抽出时间查看我的代码: 这是主要的活动:

public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private final static String API_KEY = "w7c74newrykj8m57rda6xwrk";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Toast if the API key is empty
    if(API_KEY .isEmpty()){
        Toast.makeText(getApplicationContext(), R.string.api_empty_toast, Toast.LENGTH_SHORT).show();
    }

    final RecyclerView mRecyclerView = findViewById(R.id.tournaments_rv);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

    ApiInterface apiService =
            ApiClient.getClient().create(ApiInterface.class);
    Call<TournamentResponse> call = apiService.getTournamentList(API_KEY);
    call.enqueue(new Callback<TournamentResponse>() {
        @Override
        public void onResponse(Call<TournamentResponse> call, Response<TournamentResponse> response) {
            int statusCode = response.code();
            List<Tournament_> tournaments = response.body().getResults();
            mRecyclerView.setAdapter(new TournamentsAdapter(tournaments,R.layout.tournament_item,getApplicationContext()));
        }

        @Override
        public void onFailure(Call<TournamentResponse> call, Throwable t) {
            Log.e(TAG, t.toString());
        }
    });
}

由于某些原因,适配器没有连接,API也无法工作,即使我看到示例和教程中有相同的代码。谢谢。

异步操作完成后,必须定义适配器。 移动行:

mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
要进行异步响应,请执行以下操作:

call.enqueue(new Callback<TournamentResponse>() {
        @Override
        public void onResponse(Call<TournamentResponse> call, Response<TournamentResponse> response) {
            int statusCode = response.code();
            List<Tournament_> tournaments = response.body().getResults();
            mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
            mRecyclerView.setAdapter(new TournamentsAdapter(tournaments,R.layout.tournament_item,getApplicationContext()));
        }

        @Override
        public void onFailure(Call<TournamentResponse> call, Throwable t) {
            Log.e(TAG, t.toString());
        }
    });
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
int statusCode=response.code();
列出锦标赛=response.body().getResults();
mRecyclerView.setLayoutManager(新的LinearLayoutManager(this));
mRecyclerView.setAdapter(新的TournamentsAdapter(tournaments,R.layout.tournament_项,getApplicationContext());
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
Log.e(TAG,t.toString());
}
});
com.mad.footstats E/RecyclerView:未连接适配器;跳过布局

我想让你们明白,这不是一个错误,只是一个错误 警告如果未在onCreate()中设置适配器,则会发生这种情况。如果 稍后当api响应到来时设置适配器,则会出现此警告。 您可以忽略这一点。如果以后要设置适配器。

public void setList(ArrayList<Tournament_> list) {
    if (list == null) return;
    this.list = list;
    notifyDataSetChanged();
}
如果要解决此问题,您应该按照正确的方式设置
RecycleView

(1) 在
onCreate()中初始化RecyclerView&bind适配器

或者您可以在适配器类中创建一个setList()方法,如下所示。

public void setList(ArrayList<Tournament_> list) {
    if (list == null) return;
    this.list = list;
    notifyDataSetChanged();
}
在dispatchLayout()中,我们可以发现其中存在错误:

void dispatchLayout() {
    if(this.mAdapter == null) {
        Log.e("RecyclerView", "No adapter attached; skipping layout");
    } else if(this.mLayout == null) {
        Log.e("RecyclerView", "No layout manager attached; skipping layout");
    } else {

问题在于链接。您为端点选择了错误的参数。您将永远不会得到json响应,因此Reformation无法为您解析该响应,并且您正在Reformation的响应中填充回收器视图,而Reformation从未调用过该响应

只需将xml更改为json即可获得正确的响应

https://api.sportradar.us/soccer-xt3/eu/en/tournaments.xml?api_key=API_KEY


https://api.sportradar.us/soccer-xt3/eu/en/tournaments.json?api_key=API_KEY

您是否尝试在OnResponse中加入调试器?@ZaidMirza作为初学者,我尝试过,但仍然无法解决。您的链接没有响应!我试图检查您的端点,但发现此错误
Developer Inactive
。这就是为什么会出现xml错误,并且因为没有得到响应,所以不会设置回收器视图适配器。ApiInterface类中可能存在的基本URL:@OmidHeshmatinia的重复项我有一个get方法,该方法添加了:
@get(“tournaments.xml”)Call getTournamentList(@Query(“api_key”)String apiKey)最后一个链接是:异步请求是输入onResponse还是onFailure?你能写一个日志吗;在onResponse(…)中检查请求是否成功。是的,它返回此错误:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期的BEGIN_对象,但在第1行第1列路径$1处是字符串。我确实注意到,在我发布了问题并修复了它之后,但由于某种原因它仍然不起作用
 tournaments = response.body().getResults();
 adapter.notifyDataStateChanged();
public void setList(ArrayList<Tournament_> list) {
    if (list == null) return;
    this.list = list;
    notifyDataSetChanged();
}
 adapter.setList(response.body().getResults());
void dispatchLayout() {
    if(this.mAdapter == null) {
        Log.e("RecyclerView", "No adapter attached; skipping layout");
    } else if(this.mLayout == null) {
        Log.e("RecyclerView", "No layout manager attached; skipping layout");
    } else {