我的android应用程序中有一个片段,其想法是从json文件(github)中提取信息并解析标题信息,然后将其更新到我的recyclerview中。我可以很好地提取数据,并把它放在一个列表中,这就是我的模式。
现在,此数据位于“ onResponse”内部类中,也位于“ onCreateView”内部类中。
更新我的recyclerview的代码在onCreateView内部类中。如何将列表从onResponse,onCreate甚至全局级别传递?
在该课程中,我有2个全局变量:
static List<GithubRepo> list = new ArrayList<>();
static List<String> List_body = new ArrayList<>();
现在,在创建我的视图的内部类“ Create”方法中,我正在使用改造来解析github的json以获取一些存储库名称。
我可以使它们很好,但是当我从“ response.body”中获取列表时,然后将其正确解析为字符串,即可使用以下方式获取标题:
private void setList(List<GithubRepo> repo){
if (repo != null) {
int counter = 0;
for (GithubRepo r : repo) {
String name = r.getName().toString();
List_body.add(name);
counter++;
}
}
else{
Log.d("test:empty", "empty");
}
}
上面的GithubRepo只是json的对象结构,我在内部类中获取名称,进行设置,但是当我尝试将新列表应用于我的视图时,它们仍然为null。如何从内部类中的变量设置全局/静态变量的值?
这就是全部:
public class primary_fragment extends Fragment implements Agg_Adapter.ItemClickListener {
static List<GithubRepo> list = new ArrayList<>(); <--------HOLDS value of schema object temporarily
static List<String> List_body = new ArrayList<>(); <--------UPDATES the recyclerview, currently empty
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
.... Some code
call.enqueue(new Callback<List<GithubRepo>>() {
@Override <------------------------- From here is the inner class
public void onResponse(Call<List<GithubRepo>> call, Response<List<GithubRepo>> response) {
// 1. start
if (response.isSuccessful()) {
if (response.body() != null) {
list.addAll(response.body());
setList(list);
});
Log.d("testedB2!:", (List_body.toString())); <------Should have the values set but it is null
这可能真的很简单,但是我忘记了!让我知道是否需要澄清任何事情。
答案 0 :(得分:1)
您使用Retrofit的方式使调用异步。没什么错,实际上就是应该的。但是,假设List_body
应该填写在您将其打印到日志的行中,这是不正确的。简而言之,在您的网络通话结束之前,Log.d
将运行并不显示任何内容。
有多种解决方法。最简单的方法是从onResponse
内调用一个方法,使片段知道列表已准备就绪。例如:
call.enqueue(new Callback<List<GithubRepo>>() {
@Override
public void onResponse(Call<List<GithubRepo>> call, Response<List<GithubRepo>> response) {
if (response.isSuccessful()) {
if (response.body() != null) {
list.addAll(response.body());
setList(list);
onListReady();
});
一旦方法onListReady()
被调用,您可以根据需要打印日志语句:
private void onListReady () {
Log.d("testedB2!:", (List_body.toString()));
}
您可以在片段中实现。
就像我说的那样,有不同的方法可以做到这一点。我只是想向您展示该呼叫实际上是异步运行的。