使用数组列表的 Android Spinner 数据绑定(bind)

标签 android data-binding arraylist spinner android-arrayadapter

我有一个这样的数组列表:

private ArrayList<Locations> Artist_Result = new ArrayList<Location>();

这个 Location 类有两个属性:idlocation

我需要将我的 ArrayList 绑定(bind)到微调器。我试过这样:

Spinner s = (Spinner) findViewById(R.id.SpinnerSpcial);
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, Artist_Result);
s.setAdapter(adapter);

但是,它显示对象的十六进制值。所以我认为我必须设置显示该微调器 Controller 的文本和值。

最佳答案

ArrayAdapter 尝试通过调用 Object.toString()-method 将您的 Location 对象显示为字符串(这会导致十六进制值)。 .它的默认实现返回:

[...] a string consisting of the name of the class of which the object is an instance, the at-sign character `@', and the unsigned hexadecimal representation of the hash code of the object.

要使 ArrayAdadpter 在项目列表中显示实际有用的内容,您可以覆盖 toString() 方法以返回有意义的内容:

@Override
public String toString(){
  return "Something meaningful here...";
}

另一种方法是,扩展BaseAdapter 实现SpinnerAdapter创建您自己的适配器,它知道您的 ArrayList 中的元素是对象以及如何使用这些对象的属性。

[已修订] 实现示例

我玩了一会儿,我设法让一些东西起作用:

public class Main extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Create and display a Spinner:
        Spinner s = new Spinner(this);
        AbsListView.LayoutParams params = new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT
        );
        this.setContentView(s, params);
        // fill the ArrayList:
        List<Guy> guys = new ArrayList<Guy>();
        guys.add(new Guy("Lukas", 18));
        guys.add(new Guy("Steve", 20));
        guys.add(new Guy("Forest", 50));
        MyAdapter adapter = new MyAdapter(guys);
        // apply the Adapter:
        s.setAdapter(adapter);
        // onClickListener:
        s.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            /**
             * Called when a new item was selected (in the Spinner)
             */
            public void onItemSelected(AdapterView<?> parent,
                                       View view, int pos, long id) {
                Guy g = (Guy) parent.getItemAtPosition(pos);
                Toast.makeText(
                        getApplicationContext(),
                        g.getName()+" is "+g.getAge()+" years old.",
                        Toast.LENGTH_LONG
                ).show();
            }

            public void onNothingSelected(AdapterView parent) {
                // Do nothing.
            }
        });
    }

    /**
     * This is your own Adapter implementation which displays
     * the ArrayList of "Guy"-Objects.
     */
    private class MyAdapter extends BaseAdapter implements SpinnerAdapter {

        /**
         * The internal data (the ArrayList with the Objects).
         */
        private final List<Guy> data;

        public MyAdapter(List<Guy> data){
            this.data = data;
        }

        /**
         * Returns the Size of the ArrayList
         */
        @Override
        public int getCount() {
            return data.size();
        }

        /**
         * Returns one Element of the ArrayList
         * at the specified position.
         */
        @Override
        public Object getItem(int position) {
            return data.get(position);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }
        /**
         * Returns the View that is shown when a element was
         * selected.
         */
        @Override
        public View getView(int position, View recycle, ViewGroup parent) {
            TextView text;
            if (recycle != null){
                // Re-use the recycled view here!
                text = (TextView) recycle;
            } else {
                // No recycled view, inflate the "original" from the platform:
                text = (TextView) getLayoutInflater().inflate(
                        android.R.layout.simple_dropdown_item_1line, parent, false
                );
            }
            text.setTextColor(Color.BLACK);
            text.setText(data.get(position).name);
            return text;
        }


    }

    /**
     * A simple class which holds some information-fields
     * about some Guys.
     */
    private class Guy{
        private final String name;
        private final int age;

        public Guy(String name, int age){
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }
    }
}

我对代码进行了完整的注释,如果您有任何问题,请随时提出。

关于使用数组列表的 Android Spinner 数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6562236/

相关文章:

android - 如何在 Kotlin 中关闭 Android 应用程序

asp.net - 不使用数据源控件的gridview编辑

javascript - 一个人如何通过 react 进行双向数据绑定(bind),当输入值 A 在 B 更新时更新,反之亦然?

c# - jQuery 核心/数据或自定义属性(数据驱动)

java - 在我的具体情况下,如何将此数组转换为列表?

Android LocationServices.checkLocationSettings 假阴性结果

java - 我怎样才能清除不断增长的堆?

android - 如何在android中隐藏网页的地址栏?

java - 将Item添加到ArrayList的ArrayList中

java - 在 Java 中选择大小为 N > L 的 ArrayList 的前 L 项并插入到另一个 ArrayList