将微调器绑定到动态列表
Bind spinner to dynamic list
我正在尝试绑定来自 .net 网络服务的列表。我能够从网络服务中获取列表。但是我无法将列表绑定到微调器。
private class AsyncCallWS extends AsyncTask<String, Void, Void> {
private LayoutInflater mInflater;
private List<ValueText> lstRegions;
private Activity activity;
private String strRegions;
AsyncCallWS() {
lstRegions = new LinkedList<ValueText>();
}
@Override
protected Void doInBackground(String... params) {
//Invoke webservice
try {
strRegions = WebService.invokeSelectRegionMasterWS("SelectRegionMaster");
String[] regions = strRegions.split("\},\{");
int i =0;
for (String s: regions) {
String strid = "", strName="";
//logic to add data to list
}
Spinner spnDivision = (Spinner)findViewById(R.id.spnDivision);
MySpinnerAdapter adptRegion =
new MySpinnerAdapter(MyActivity.this,
android.R.layout.simple_spinner_item, lstRegions);
} catch (Exception e) {
Log.e("myException", e.getMessage());
}
return null;
}
}
所以我可以从这里调用 MySpinnerAdapter
,但我不能使用 setadapter,因为这是工作线程。 doInBackground
方法必须为 Void。那么有什么办法可以 return 列表吗?或者我可以将列表存储在类似视图状态的内容中(视图状态为 asp.net)。我对 Java 和 Android 很陌生。我真的不知道如何前进。请帮忙。
您可以全局声明静态变量并将列表存储在该变量中,在 post 执行后您可以在微调器中使用该变量和绑定值。
您可以创建 callback 来 return 来自 Web 服务的数据,然后在您的 activity 中您可以将此数据设置为适配器并将其附加到微调器。
示例:
AsyncCallWS.class
public class AsyncCallWS extends AsyncTask<String, Void, List<String>> {
@NonNull
private OnTaskCompleteCallback callback;
public AsyncCallWS(@NonNull OnTaskCompleteCallback callback) {
this.callback = callback;
}
@Override
protected List<String> doInBackground(String... params) {
try {
//fetch data from web service
List<String> result = new ArrayList<>();
for (int i = 0; i < 10; i++) {
//here you can add all needed values which will be used in spinner
result.add("Item " + i);
}
return result;
} catch (Exception e) {
return Collections.emptyList();
}
}
@Override
protected void onPostExecute(List<String> strings) {
super.onPostExecute(strings);
callback.dataReady(strings);
}
public interface OnTaskCompleteCallback {
void dataReady(@NonNull List<String> data);
}
}
MainActivity.class
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import java.util.List;
public class MainActivity extends AppCompatActivity implements AsyncCallWS.OnTaskCompleteCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AsyncCallWS callWS = new AsyncCallWS(this);
callWS.execute("some_params");
}
@Override
public void dataReady(@NonNull List < String > data) {
//here you can set data in adapter
}
}
顺便说一句,看看 RxJava,使用这种方法你可以用几行代码轻松地完成异步任务。如果您对此感兴趣,我可以添加使用 RxJava
的示例
我正在尝试绑定来自 .net 网络服务的列表。我能够从网络服务中获取列表。但是我无法将列表绑定到微调器。
private class AsyncCallWS extends AsyncTask<String, Void, Void> {
private LayoutInflater mInflater;
private List<ValueText> lstRegions;
private Activity activity;
private String strRegions;
AsyncCallWS() {
lstRegions = new LinkedList<ValueText>();
}
@Override
protected Void doInBackground(String... params) {
//Invoke webservice
try {
strRegions = WebService.invokeSelectRegionMasterWS("SelectRegionMaster");
String[] regions = strRegions.split("\},\{");
int i =0;
for (String s: regions) {
String strid = "", strName="";
//logic to add data to list
}
Spinner spnDivision = (Spinner)findViewById(R.id.spnDivision);
MySpinnerAdapter adptRegion =
new MySpinnerAdapter(MyActivity.this,
android.R.layout.simple_spinner_item, lstRegions);
} catch (Exception e) {
Log.e("myException", e.getMessage());
}
return null;
}
}
所以我可以从这里调用 MySpinnerAdapter
,但我不能使用 setadapter,因为这是工作线程。 doInBackground
方法必须为 Void。那么有什么办法可以 return 列表吗?或者我可以将列表存储在类似视图状态的内容中(视图状态为 asp.net)。我对 Java 和 Android 很陌生。我真的不知道如何前进。请帮忙。
您可以全局声明静态变量并将列表存储在该变量中,在 post 执行后您可以在微调器中使用该变量和绑定值。
您可以创建 callback 来 return 来自 Web 服务的数据,然后在您的 activity 中您可以将此数据设置为适配器并将其附加到微调器。
示例:
AsyncCallWS.class
public class AsyncCallWS extends AsyncTask<String, Void, List<String>> {
@NonNull
private OnTaskCompleteCallback callback;
public AsyncCallWS(@NonNull OnTaskCompleteCallback callback) {
this.callback = callback;
}
@Override
protected List<String> doInBackground(String... params) {
try {
//fetch data from web service
List<String> result = new ArrayList<>();
for (int i = 0; i < 10; i++) {
//here you can add all needed values which will be used in spinner
result.add("Item " + i);
}
return result;
} catch (Exception e) {
return Collections.emptyList();
}
}
@Override
protected void onPostExecute(List<String> strings) {
super.onPostExecute(strings);
callback.dataReady(strings);
}
public interface OnTaskCompleteCallback {
void dataReady(@NonNull List<String> data);
}
}
MainActivity.class
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import java.util.List;
public class MainActivity extends AppCompatActivity implements AsyncCallWS.OnTaskCompleteCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AsyncCallWS callWS = new AsyncCallWS(this);
callWS.execute("some_params");
}
@Override
public void dataReady(@NonNull List < String > data) {
//here you can set data in adapter
}
}
顺便说一句,看看 RxJava,使用这种方法你可以用几行代码轻松地完成异步任务。如果您对此感兴趣,我可以添加使用 RxJava
的示例