【问题标题】:using the setOnItemSelectedListener and onNothingSelected with spinner使用带有微调器的 setOnItemSelectedListener 和 onNothingSelected
【发布时间】:2016-10-09 07:08:11
【问题描述】:

我只是想知道是否有人可以帮助我解决我目前面临的问题,因为我正在尝试使用微调器实现 setOnItemSelectedListener 和 onNothingSelected 事件。

一旦用户从微调器中选择选项,它将向他们显示谷歌地点名称,然后当用户点击一个地点时,它将显示另一个名为 details.java 的页面,其中包含该地点的详细信息以及地图视图。

我认为我错误地使用了这两个特定选项,因此请有人帮助和建议我吗?

public class PlaceActivity extends AppCompatActivity implements
        AdapterView.OnItemSelectedListener {

    public ArrayList<GetterSetter> myArrayList;
    private Toolbar toolbar;
    private Spinner spinner;
    ListView myList;
    private String[] places;
    ProgressDialog dialog;
    TextView nodata;
    PlaceAdapter adapter;
    GetterSetter addValues;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_place);

        if (!isNetworkAvailable()) {
            Toast.makeText(getApplicationContext(), "Enable internet connection and RE-LAUNCH!!",
                    Toast.LENGTH_LONG).show();
            return;
        }

        myList = (ListView) findViewById(R.id.myList);
        toolbar = (Toolbar) findViewById(R.id.tool_bar);
        places = getResources().getStringArray(R.array.places);

        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        setTitle("Title");

        spinner  = (Spinner) findViewById(R.id.spinnerplaces);


        // Create an ArrayAdapter using the string array and a default spinner
        ArrayAdapter<CharSequence> listAdapter = ArrayAdapter
                .createFromResource(this, R.array.places,
                        android.R.layout.simple_spinner_item);

        // Specify the layout to use when the list of choices appears
        listAdapter
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        // Apply the adapter to the spinner
        spinner.setAdapter(listAdapter);
        ArrayAdapter<CharSequence> list = ArrayAdapter.createFromResource(PlaceActivity.this, R.array.places,android.R.layout.simple_spinner_item);
        list.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        spinner.setOnItemSelectedListener(this);
    }


    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view,  int itemPosition, long itemId) {
        dialog = ProgressDialog.show(this, "", "Please wait", true);
        // Google Places Access key and location values.
        new readFromGooglePlaceAPI()
                .execute("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"
                        + "location=53.795984,-1.759398&radius=900&sensor=true&"
                        + "key=AIzaSyA7CzOa10AOfBAU9FvaIrVlVyCKzXxiCc0&types="
                        + places[itemPosition]);
        myList.OnItemSelectedListener(this);
        return true;


    }

    public class readFromGooglePlaceAPI extends AsyncTask<String, Void, String> {
        @Override protected String doInBackground(String... param) {
            return readJSON(param[0]);
        }

        protected void onPostExecute(String str) {
            myArrayList = new ArrayList<GetterSetter>();
            try {
                JSONObject root = new JSONObject(str);
                JSONArray results = root.getJSONArray("results");
                for (int i = 0; i < results.length(); i++) {
                    JSONObject arrayItems = results.getJSONObject(i);
                    JSONObject geometry = arrayItems.getJSONObject("geometry");
                    JSONObject location = geometry.getJSONObject("location");
                    addValues = new GetterSetter();
                    addValues.setLat(location.getString("lat"));
                    addValues.setLon(location.getString("lng"));
                    addValues.setName(arrayItems.getString("name").toString());
                    addValues.setRating(arrayItems.getString("rating").toString());
                    addValues.setVicinity(arrayItems.getString("vicinity").toString());
                    myArrayList.add(addValues);

                    Log.d("Before", myArrayList.toString());

                }

            } catch (Exception e) {

            }
            System.out
                    .println("############################################################################");
            Log.d("After:", myArrayList.toString());
            nodata = (TextView) findViewById(R.id.nodata);
            nodata.setVisibility(View.GONE);
            adapter = new PlaceAdapter(PlaceActivity.this, R.layout.list_row, myArrayList);
            myList.setAdapter(adapter);
            adapter.notifyDataSetChanged();
            dialog.dismiss();
        }

    }

    public String readJSON(String URL) {
        StringBuilder sb = new StringBuilder();
        HttpGet httpGet = new HttpGet(URL);
        HttpClient client = new DefaultHttpClient();

        try {
            HttpResponse response = client.execute(httpGet);
            StatusLine statusLine = response.getStatusLine();
            if (statusLine.getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                InputStream content = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;

                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
            } else {
                Log.e("JSON", "Couldn't find JSON file");
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        // no-op
    }

下面的代码我应该放在哪里。

 @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        Intent details = new Intent(MainActivity.this, Details.class);
        details.putExtra("name", myArrayList.get(arg2).getName());
        details.putExtra("rating", myArrayList.get(arg2).getRating());
        details.putExtra("vicinity", myArrayList.get(arg2).getVicinity());
        details.putExtra("lat", myArrayList.get(arg2).getLat());
        details.putExtra("lon", myArrayList.get(arg2).getLon());
        startActivity(details);
    }

【问题讨论】:

    标签: java android drop-down-menu spinner android-spinner


    【解决方案1】:

    你的方向是对的。现在你已经有了必要的方法,但是你已经让你的类实现了 OnItemSelectedListener 并将它设置为你的微调器的监听器:

    公共类 PlaceActivity 扩展 AppCompatActivity 实现 OnItemSelectedListener { ... }

    然后要将类设置为侦听器,您可以在后面添加以下行: spinner = (Spinner) findViewById(R.id.spinnerplaces);

    spinner.setOnItemSelectedListener(this);

    【讨论】:

    • 您能否详细说明您进行更改时发生了什么?
    • 我可以看到狙击手,但是单击列表选项后什么也没有发生。请帮忙。
    • 我在哪里放下面的代码。 @Override public void onItemClick(AdapterView> arg0, View arg1, int arg2, long arg3) { Intent details = new Intent(MainActivity.this, Details.class); details.putExtra("name", myArrayList.get(arg2).getName()); details.putExtra("rating", myArrayList.get(arg2).getRating()); details.putExtra("vicinity", myArrayList.get(arg2).getVicinity()); details.putExtra("lat", myArrayList.get(arg2).getLat()); details.putExtra("lon", myArrayList.get(arg2).getLon());开始活动(详细信息); }
    • 只是为了澄清一下,在用户从微调器中选择一个选项后,您获得的 Google 放置数据用于填充您的列表视图对吗?如果是这样,那么您需要做的就是为 ListView 设置侦听器。我现在不能给你看代码,但是 ListView 的 Android 指南应该有一个关于如何做到这一点的例子。另外,我是那个听众,您将拥有上面代码所在的 on click 方法。
    • 是的,这是正确的。只是我使用了新的 Android SDK 中不再提供的 Sherlock Actionbar。我离开 Andriod 去了 IOS,当我回来时,他们改变了很多东西。我现在一无所知。
    【解决方案2】:

    我建议是这样的:

    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, 
                                   int pos, long id) {
    //If you're wondering, int pos is the position of the item selected (starting with 0)
    // what you want onClick
    }
    

    您的代码:

     @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            Intent details = new Intent(MainActivity.this, Details.class);
            details.putExtra("name", myArrayList.get(arg2).getName());
            details.putExtra("rating", myArrayList.get(arg2).getRating());
            details.putExtra("vicinity", myArrayList.get(arg2).getVicinity());
            details.putExtra("lat", myArrayList.get(arg2).getLat());
            details.putExtra("lon", myArrayList.get(arg2).getLon());
            startActivity(details);
        }
    

    可以在微调器的初始化下进行。

    希望对您有所帮助!祝你好运!

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多