Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is the textViewResourceId argument always necessary?

While writing my own adapter that extends the ArrayAdapter class, I came across the different constructors available and I noticed they all require a textViewResourceId parameter. So initially, I decided that I would feed my custom adapter class android.R.id.text1:

MyAdapter adapter = new MyAdapter(this, R.layout.myRow, android.R.id.text1);

However, later on during my development, I decided to override getView method where I would

TextView label = (TextView) myRow.findViewById(android.R.id.text1);
label.setText("Position #" + position);

Which worked fine. But then this question came to mind: if I'm doing the logic for how to display the row, is it really necessary to provide a textViewResourceId to the constructor when I initiate my custom adapter? Or is it the case that when you override getView, that parameter is no longer necessary? If my thinking is correct, what is the common practice for instantiating the adapter knowing that you will be overriding the display behavior anyways?

like image 873
paul smith Avatar asked Dec 13 '12 21:12

paul smith


1 Answers

If you are overriding getView you do NOT need to specify a proper textViewResourceId.. You can pass in 0. The only time the ArrayAdapter tries to access that ID is within getView.. Since you are overriding getView and providing your own view textViewResourceId is never accessed.. Since the super class expects a view ID.. you still need to pass in a view ID into the super call.. however, it can just be 0 since it will never be used

ArrayAdapter Source confirming all of this

If you do not specify a proper textViewResourceId and do not override getView.. getView in the ArrayAdapter assumes your entire view is a TextView.. If your view is not a TextView.. you will end up with crashes from a ClassCastException..

like image 180
dymmeh Avatar answered Oct 27 '22 07:10

dymmeh