我已经在这里关注了一些线索,但即使我觉得它与示例相匹配而且我不知道为什么,我也无法使用它。
我创建了一个简单的微调器..在我的AsyncTaskRunner类中,我从REST API中提取信息,然后在onPostExecute中尝试将其添加到Spinner ..但是当我调试/运行我的应用时,Spinner内容为空。调试时,webChannelList肯定不是空的并且有内容
如果我不尝试动态添加任何内容,只需在onCreate方法中手动添加内容就可以了。但是出于实际目的,我试图动态地进行操作。
所以说要通过我做过的MainActivity ..但它不起作用。救命啊!
解决方案:我的doInBackground函数中有Debug.waitForDebugger();
...一旦我删除它就完美了。
<Spinner
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/singularSpinner" />
我省略了与我要求的内容无关的内容
public class MainActivity extends AppCompatActivity {
// Global Variables
private List<String> webChannelList = new ArrayList<String>();
private Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Load Singular Web Channels into GUI
AsyncTaskRunner runner = new AsyncTaskRunner(this);
runner.execute();
}
class AsyncTaskRunner extends AsyncTask<Void, Void, Void> {
MainActivity mainActivity;
@Override
protected Void doInBackground(Void... params) {
Debug.waitForDebugger(); //REMOVING THIS WORKS
webChannelList = StuffFromAPI();
return null;
}
@Override
protected void onPostExecute(Void result) {
if (!webChannelList.isEmpty()) {
spinner = (Spinner) findViewById(R.id.singularSpinner);
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter =
new ArrayAdapter<String>(mainActivity, android.R.layout.simple_spinner_item, webChannelList);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Attaching data adapter to spinner
spinner.setAdapter(dataAdapter);
}
}
}
}
编辑:所以我省略了StuffFromAPI()函数,只是手动添加了webChannelList.add(“hello”);例如,它从StuffFromAPI()函数完美运行..奇怪的是,即使我只是将其注释掉并手动添加内容。几乎像它的缓存?但现在我无法复制它......所以有些事情正在发生,我不知道是什么。我是Android开发的新手,也许有一些我很想念的东西。我所做的就是去Build - &gt;运行或构建 - &gt;调试,我有一个平板电脑
编辑2: onPostExecute函数是否可能在从我的API中获取项目之前运行?这仍然没有意义,因为我在调试时实际看到了那里的内容,但它仍未在GUI中显示
答案 0 :(得分:1)
对 Edit2 的回复:是的,这可能取决于您的API调用是否异步。您应该检查返回的数组列表的大小。你是如何获取数据的?
这不是你的问题,但我建议你安排你的代码有点不同。
为ArrayAdapter和响应数据列表webChannelList创建成员。然后在onPostExecute中,您需要做的就是调用通知数据已更改。这样更灵活,更容易维护。
ArrayList<someType> webChannelList = new ArrayList<>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
spinner = (Spinner) findViewById(R.id.singularSpinner);
// Creating adapter for spinner
dataAdapter = new ArrayAdapter<String>(mainActivity, android.R.layout.simple_spinner_item, webChannelList);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Attaching data adapter to spinner
spinner.setAdapter(dataAdapter);
// Load Singular Web Channels into GUI
AsyncTaskRunner runner = new AsyncTaskRunner(this);
runner.execute();
}
class AsyncTaskRunner extends AsyncTask<Void, Void, Void> {
MainActivity mainActivity;
@Override
protected Void doInBackground(Void... params) {
webChannelList = StuffFromAPI();
return null;
}
@Override
protected void onPostExecute(Void result) {
dataAdapter.notifyDataSetChanged();
}
}