Почему GetItem (позиция) работает с новым экземпляром? (не должно быть равно нулю?)

#java #android #casting #android-listfragment

#java #Android #Кастинг #android-listfragment

Вопрос:

Я пытаюсь изучать Java, я читал о кастинге, создании экземпляров объектов, массивов, хэш-карт и т. Д. Я создавал коды для Android, и у меня все шло хорошо, пока я не столкнулся с этим:

 MyObject instObject = (MyObject)getItem(position);  
  

Из того, что я узнал до сих пор… Я создаю новый экземпляр MyObject в instObject, поэтому я думаю, что значение должно быть равно нулю.
Но потом, когда я звоню setText(...) , это работает! =o

Пожалуйста, постарайтесь не обобщать ответ, потому что понять это было очень сложно для меня до сих пор!
Я говорю по-испански, я немного знаю английский, но не так хорошо.

 public class MyClass extends ListFragment {
    List<MyObject> instObject;  //instObject = 0
    ...

    @Override
    public void onActivityCreated(Bundle savedInstanceState){
        super.onActivityCreated(savedInstanceState);

        instObject = new ArrayList<MyObject>();
        MyObject item = ...
        instObject.add(item); //instObject = items
    }

    //Adapter{
        ...

        @Override
        public View getView(int position, View view, ViewGroup parent) {
            MyObject instObject = (MyObject)getItem(position);
            //instObject = ? (should not be zero?)
            holder.title.setText( instObject.getTitle() );
            // why return the corresponding title?
        }  
    }

    public class MyObject {  
        vars...  
        constructor...  
        setters...  
        getters...  
    }
}
  

Решаемая СПАСИБО !!! 🙂

У меня было три путаницы…

Первый:
Я подумал, что если «instObject» был создан внутри «onActivityCreated», к этому «instObject» невозможно получить доступ изнутри адаптера. (и мы не можем) Внутри адаптера, «instObject», равно нулю, но… Я забыл, что внутри адаптера конструктора «instObject» снова получить элементы, созданные в «onActivityCreated». (извините)

Второй:
Я подумал, что это может привести к получению элемента с чем-то вроде этого:

 item = instObject.getItem(position);  //well I'm newbie!  :P
  

А затем получите содержимое следующим образом:

 myView.setText(item.getTitle());
  

Третий:
Я упустил из виду, что метод GetItem(), имел это:

 @Override
public Object getItem(int position) {
    return instObject.get(position);
}  
  

Перед getView(), «instObject», были все элементы, но затем с:

 MyObject instObject = (MyObject)getItem(position);
  

На техническом языке я думаю, что, возможно, так:
Я делаю ссылку на «instObject» в определенной позиции.

Без технических…
Я создаю переменную типа object с тем же именем и устанавливаю только один из всех элементов «instObject».

Думаю, я понял, еще раз спасибо! 🙂

Комментарии:

1. Я не до конца понимаю проблему. Но «MyObject instObject = (MyObject) GetItem (position);» не создаст новый объект, вместо этого он вернет тот же объект, который вы добавили ранее.

2. @naveejr: он вернет ССЫЛКУ на этот объект (просто в качестве дополнительной информации)

Ответ №1:

Это зависит от того, что getItem() делает метод внутри адаптера. Но, вообще говоря, когда вы это делаете getItem() , адаптер возвращает ссылку на объект в этой конкретной позиции из коллекции, которая была передана адаптеру при создании адаптера.

Ответ №2:

Из того, что я узнал до сих пор… Я создаю новый экземпляр MyObject в instObject, поэтому я думаю, что значение должно быть равно нулю. Но затем, когда я вызываю setText(…) , это работает!!! =o

В Java вы создаете новый объект / экземпляр с new помощью оператора, как в:

 Employee employee = new Employee();
  

Ваш вызов getItem() возвращает ссылку на уже существующий объект. По сути, где-то «за кулисами» уже создан новый объект, и GetItem() просто возвращает ссылку на него. Затем вы сохраняете эту ссылку в instObject.