【问题标题】:Bind spinner to dynamic list将微调器绑定到动态列表
【发布时间】:2016-10-23 01:54:41
【问题描述】:

我正在尝试绑定来自 .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 方法必须是无效的。那么有什么办法可以返回列表吗?或者我可以将列表存储在类似视图状态(视图状态是 asp.net)中。我对 Java 和 Android 很陌生。我真的不知道如何前进。请帮忙。

【问题讨论】:

    标签: java android android-studio spinner


    【解决方案1】:

    您可以创建callback,它将从网络服务返回数据,然后在您的活动中将此数据设置为适配器并将其附加到微调器。

    例子:

    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 的示例

    【讨论】:

      【解决方案2】:

      您可以全局声明静态变量并将列表存储在该变量中,在执行后您可以使用该变量并在微调器中绑定值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 2015-06-05
        • 1970-01-01
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多