【问题标题】:Showing last items in Spinner View Android在 Spinner View Android 中显示最后的项目
【发布时间】:2015-12-09 13:52:12
【问题描述】:

我正在尝试从数组中填充微调器。一切正常,但是当我单击微调器时,视图会将我带到数组的最后一项。所以我需要向上滚动才能看到第一项。

我想从头而不是从尾获得视图。请查看我的代码。我在 XML 中使用了 android:spinnerMode = "dialog"

我的 spinner1 显示视图中的最后一项,但所有项都按正确的顺序排列。

public class Pinbyplace extends AppCompatActivity {

Spinner spinner1, spinner2, spinner3;
ArrayAdapter<String> adapter1, adapter2, adapter3;

public String[] state = {"Andaman and Nicobar Islands", "Andhra Pradesh", "Arunachal Pradesh", "Assam",
        "Bihar", "Chandigarh", "Chhattisgarh", "Dadar and Nagar Haveli",
        "Daman and Diu", "Delhi", "Goa", "Gujarat", "Haryana", "Himachal Pradesh",
        "Jammu and Kashmir", "Jharkhand", "Karnataka", "Kerala", "Lakshadeep",
        "Madya Pradesh", "Maharashtra", "Manipur", "Meghalaya", "Mizoram", "Nagaland",
        "Odhisa", "Pondicherry","Punjab", "Rajasthan", "Sikkim", "Tamil Nadu",enter code here
        "Tripura", "Uttaranchal", "Uttar Pradesh", "West Bengal", "Select State"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pincode_place);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });

    spinner1 = (Spinner) findViewById(R.id.spinner1);
    spinner2 = (Spinner) findViewById(R.id.spinner2);
    spinner3 = (Spinner) findViewById(R.id.spinner3);

    adapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, state) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = super.getView(position, convertView, parent);
            if (position == getCount()) {
                ((TextView)v.findViewById(android.R.id.text1)).setText("");
                ((TextView)v.findViewById(android.R.id.text1)).setHint(getItem(getCount()));
            }
            return v;
        }

        @Override
        public int getCount() {
            return super.getCount()-1;
        }
    };

    //adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner1.setAdapter(adapter1);
    spinner1.setSelection(adapter1.getCount());

    adapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = super.getView(position, convertView, parent);
            if (position == getCount()) {
                ((TextView)v.findViewById(android.R.id.text1)).setText("");
                ((TextView)v.findViewById(android.R.id.text1)).setHint(getItem(getCount()));
            }
            return v;
        }

        @Override
        public int getCount() {
            return super.getCount() - 1;
        }
    };

    adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    adapter2.add("Item 1");
    adapter2.add("Item 2");
    adapter2.add("Select District");

    spinner2.setAdapter(adapter2);
    spinner2.setSelection(adapter2.getCount());

    adapter3 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = super.getView(position, convertView, parent);
            if (position == getCount()) {
                ((TextView)v.findViewById(android.R.id.text1)).setText("");
                ((TextView)v.findViewById(android.R.id.text1)).setHint(getItem(getCount()));
            }
            return v;
        }

        @Override
        public int getCount() {
            return super.getCount()-1;
        }
    };

    adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    adapter3.add("Item 1");
    adapter3.add("Item 2");
    adapter3.add("Select Place");

    spinner3.setAdapter(adapter3);
    spinner3.setSelection(adapter3.getCount());

}
 }

见下图:

更新:我为此找到了一个更好、更简单的解决方案..

public class Pinbyplace extends AppCompatActivity {

Spinner spinner_state, spinner_district, spinner_place;
HintArrayAdapter hintAdapter_state, hintAdapter_district, hintAdapter_place;

public String[] state = {"Select State", "Andaman and Nicobar Islands","Andhra Pradesh",
        "Arunachal Pradesh","Assam","Bihar", "Chandigarh","Chhattisgarh",
        "Dadra and Nagar Haveli","Daman and Diu","Delhi", "Goa","Gujarat","Haryana",
        "Himachal Pradesh","Jammu and Kashmir","Jharkhand", "Karnataka","Kerala",
        "Lakshadweep","Madhya Pradesh","Maharashtra","Manipur", "Meghalaya","Mizoram",
        "Nagaland","Odisha","Puducherry","Punjab","Rajasthan", "Sikkim","Tamil Nadu",
        "Telangana","Tripura","Uttar Pradesh","Uttarakhand","West Bengal"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pincode_place);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });

    spinner_state = (Spinner) findViewById(R.id.spinner1);
    spinner_district = (Spinner) findViewById(R.id.spinner2);
    spinner_place = (Spinner) findViewById(R.id.spinner3);

    hintAdapter_state = new HintArrayAdapter<>(getApplicationContext(), 0);
    hintAdapter_state.addAll(state);
    spinner_state.setAdapter(hintAdapter_state);

    spinner_state.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(position > 0) {
                spinner_state.setSelection(position);
                String state_name = (String) spinner_state.getSelectedItem();
                Toast.makeText(getApplication(), state_name, Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

    hintAdapter_district = new HintArrayAdapter<>(getApplicationContext(), 0);
    hintAdapter_district.add("Select Distrcit");
    spinner_district.setAdapter(hintAdapter_district);

    spinner_district.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(position > 0) {
                spinner_district.setSelection(position);
                String district_name = (String) spinner_district.getSelectedItem();
                Toast.makeText(getApplication(), district_name, Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

    hintAdapter_place = new HintArrayAdapter<>(getApplicationContext(), 0);
    hintAdapter_place.add("Select Place");
    spinner_place.setAdapter(hintAdapter_place);

    spinner_place.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(position > 0) {
                spinner_place.setSelection(position);
                String place_name = (String) spinner_place.getSelectedItem();
                Toast.makeText(getApplication(), place_name, Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });
}

private class HintArrayAdapter<T> extends ArrayAdapter<T> {

    Context mContext;

    public HintArrayAdapter(Context context, int resource) {
        super(context, resource);
        this.mContext = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false);
        TextView texview = (TextView) view.findViewById(android.R.id.text1);
        texview.setTextColor(Color.BLACK);
        texview.setHintTextColor(Color.GRAY);

        if(position == 0) {
            texview.setText("");
            texview.setHint(getItem(position).toString()); //"Hint to be displayed"
        } else {
            texview.setText(getItem(position).toString());
        }

        return view;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        View view;

        if(position == 0){
            view = inflater.inflate(R.layout.spinner_hint_list_item_layout, parent, false); // Hide first row
        } else {
            view = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false);
            TextView texview = (TextView) view.findViewById(android.R.id.text1);
            texview.setTextColor(Color.BLACK);
            texview.setText(getItem(position).toString());
        }

        return view;
    }
}
}

【问题讨论】:

    标签: android arrays xml view spinner


    【解决方案1】:
     adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        adapter3.add("Item 1");
        adapter3.add("Item 2");
        adapter3.add("Select Place");
    
        spinner3.setAdapter(adapter3);
        spinner3.setSelection(adapter3.getCount());
    

    改成

    spinner3.setSelection(0);
    

    因为 spinner3.setSelection(adapter3.getCount());表示 Spinner Postion 是您的数组大小。所以 Spinner Goto Last Index ......

    【讨论】:

    • 我将 setSelection 设置为 0,但通过这样做,我的数组的第一个元素出现在微调器提示(突出显示)上。我向微调器添加了提示作为数组的最后一个元素。这就是我最后使用spinner1.setSelection(adapter1.getcount()) 的原因。
    【解决方案2】:

    尝试评论这些行

    spinner.setSelection()
    

    它的作用是在你的微调器中设置选定的项目。

    这里你写的像

    spinner.setSelection(adapter.getCount())
    

    所以它正在选择最后一项。

    编辑

    通过这个链接,可以发布整个代码,但这似乎是多余的,

    https://stackoverflow.com/a/27692614/2641726

    CustomSpinner 类中,在 'performClick()' 方法中,将选择设置为 0,如下所示

    this.setSelection(0)

    但是您必须管理状态并相应地工作,是的,在您的 xml 布局文件中将 Spinner 替换为 CustomSpinner

    【讨论】:

    • 通过这样做,数组的第一个元素在 Spinner 中作为 Hint 出现。我的提示出现在数组的最后一个元素中。所以我想要的是在选择之前我的微调器显示提示,但是当我触摸它时,视图应该从头开始而不是从结尾开始,并且提示元素不应该出现在微调器列表中。
    • 是的,我遇到了您面临的问题,我正在更新我的答案,因为没有直接的解决方案,您必须编写一个自定义微调器和管理器,因此,这是您可以使用的一种解决方案使用,希望对你有帮助
    • 感谢您的帮助.. +1
    • 如果它确实解决了您的问题,那么您可以接受它作为答案,因为它也可以帮助其他人。顺便说一句,欢迎您
    【解决方案3】:

    很抱歉,以上都不适合我。 但是 spinner.setSelection(adapter.getCount()-1) 对我有用 由于 getCount() 是大小,我们必须减去 1 才能将其转换为索引。否则只会 OutofBound 异常。

    谢谢。

    【讨论】:

      猜你喜欢
      • 2015-04-03
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      相关资源
      最近更新 更多