How to use ArrayAdapter

后端 未结 5 1839
夕颜
夕颜 2020-11-22 14:23
ArrayList myList = new ArrayList();

ListView listView = (ListView) findViewById(R.id.list);

ArrayAdapter adapter = new         


        
相关标签:
5条回答
  • 2020-11-22 14:27

    I think this is the best approach. Using generic ArrayAdapter class and extends your own Object adapter is as simple as follows:

    public abstract class GenericArrayAdapter<T> extends ArrayAdapter<T> {
    
      // Vars
      private LayoutInflater mInflater;
    
      public GenericArrayAdapter(Context context, ArrayList<T> objects) {
        super(context, 0, objects);
        init(context);
      }
    
      // Headers
      public abstract void drawText(TextView textView, T object);
    
      private void init(Context context) {
        this.mInflater = LayoutInflater.from(context);
      }
    
      @Override public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder vh;
        if (convertView == null) {
          convertView = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
          vh = new ViewHolder(convertView);
          convertView.setTag(vh);
        } else {
          vh = (ViewHolder) convertView.getTag();
        }
    
        drawText(vh.textView, getItem(position));
    
        return convertView;
      }
    
      static class ViewHolder {
    
        TextView textView;
    
        private ViewHolder(View rootView) {
          textView = (TextView) rootView.findViewById(android.R.id.text1);
        }
      }
    }
    

    and here your adapter (example):

    public class SizeArrayAdapter extends GenericArrayAdapter<Size> {
    
      public SizeArrayAdapter(Context context, ArrayList<Size> objects) {
        super(context, objects);
      }
    
      @Override public void drawText(TextView textView, Size object) {
        textView.setText(object.getName());
      }
    
    }
    

    and finally, how to initialize it:

    ArrayList<Size> sizes = getArguments().getParcelableArrayList(Constants.ARG_PRODUCT_SIZES);
    SizeArrayAdapter sizeArrayAdapter = new SizeArrayAdapter(getActivity(), sizes);
    listView.setAdapter(sizeArrayAdapter);
    

    I've created a Gist with TextView layout gravity customizable ArrayAdapter:

    https://gist.github.com/m3n0R/8822803

    0 讨论(0)
  • 2020-11-22 14:33

    Subclass the ArrayAdapter and override the method getView() to return your own view that contains the contents that you want to display.

    0 讨论(0)
  • 2020-11-22 14:34

    Implement custom adapter for your class:

    public class MyClassAdapter extends ArrayAdapter<MyClass> {
    
        private static class ViewHolder {
            private TextView itemView;
        }
    
        public MyClassAdapter(Context context, int textViewResourceId, ArrayList<MyClass> items) {
            super(context, textViewResourceId, items);
        }
    
        public View getView(int position, View convertView, ViewGroup parent) {
    
            if (convertView == null) {
                convertView = LayoutInflater.from(this.getContext())
                .inflate(R.layout.listview_association, parent, false);
    
                viewHolder = new ViewHolder();
                viewHolder.itemView = (TextView) convertView.findViewById(R.id.ItemView);
    
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
    
            MyClass item = getItem(position);
            if (item!= null) {
                // My layout has only one TextView
                    // do whatever you want with your string and long
                viewHolder.itemView.setText(String.format("%s %d", item.reason, item.long_val));
            }
    
            return convertView;
        }
    }
    

    For those not very familiar with the Android framework, this is explained in better detail here: https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView.

    0 讨论(0)
  • 2020-11-22 14:38

    You could just add a toString() method to MyClass, per http://developer.android.com/reference/android/widget/ArrayAdapter.html:

    However the TextView is referenced, it will be filled with the toString() of each object in the array. You can add lists or arrays of custom objects. Override the toString() method of your objects to determine what text will be displayed for the item in the list.

    class MyClass {
    
     @Override
     public String toString() {
      return "Hello, world.";
     }
    }
    
    0 讨论(0)
  • 2020-11-22 14:45

    Here's a quick and dirty example of how to use an ArrayAdapter if you don't want to bother yourself with extending the mother class:

    class MyClass extends Activity {
        private ArrayAdapter<String> mAdapter = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            mAdapter = new ArrayAdapter<String>(getApplicationContext(),
                android.R.layout.simple_dropdown_item_1line, android.R.id.text1);
    
            final ListView list = (ListView) findViewById(R.id.list);
            list.setAdapter(mAdapter);
    
            //Add Some Items in your list:
            for (int i = 1; i <= 10; i++) {
                mAdapter.add("Item " + i);
            }
    
            // And if you want selection feedback:
            list.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    //Do whatever you want with the selected item
                    Log.d(TAG, mAdapter.getItem(position) + " has been selected!");
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题