Пользовательский класс в адаптере списка

У меня возникли проблемы с пониманием того, как область действия влияет на мой код. Кажется, я не могу получить доступ к публичным атрибутам публичного класса.

Я создал пользовательский класс ArtistPacket, в котором есть блок информации, который я хотел бы отправить своему пользовательскому адаптеру (ArtistListAdapter).

Пользовательский класс ниже:

public class ArtistPacket{

    public String name;
    public int id;

    public ArtistPacket(String name, int id){
        this.name = name;
        this.id = id;
    }

}

Он определен в MainActivityFragment, где я создаю ArtistListAdapter, который принимает эти ArtistPackets.

public class MainActivityFragment extends Fragment{

...

ArtistListAdapter<ArtistPacket> artistListAdapter  = 
  new ArtistListAdapter<ArtistPacket>(getActivity(), artistData);

...

Затем я определяю ArtistListAdapter и getView

private class ArtistListAdapter<ArtistPacket> extends ArrayAdapter<ArtistPacket>{

    public ArtistListAdapter(Context context,ArrayList<ArtistPacket> artists){
        super(getActivity(),0,artists);
    }

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

...

В getView мне нужны name и id из объекта ArtistPacket (в данном случае artist). Поэтому я пытаюсь позвонить

ArtistPacket artist = getItem(position);    
textItemContent.setText((CharSequence) artist.name);

Но я получаю ошибку компиляции. В отладчике кажется, что проходит весь объект - просто не похоже, что адаптер получает доступ к атрибуту name или id.

Ошибка, которую я получаю:

Error:(98, 58) error: cannot find symbol variable name
where ArtistPacket is a type-variable:
ArtistPacket extends Object declared in class      
  MainActivityFragment.ArtistListAdapter

Есть ли проблема с областью действия в моей реализации? Почему адаптер не может видеть содержимое объекта ArtistPacket, если оно ясно видно в отладчике?

Вот полный getView:

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

        // Find the artist packet at a given position
        ArtistPacket artist = getItem(position);

        if (view == null) {
            view = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
        }

        TextView textItemContent = (TextView) view.findViewById(R.id.list_item_content);
        ImageView imageViewContent = (ImageView) view.findViewById(R.id.list_item_image);

        textItemContent.setText((CharSequence) artist.name);
        imageViewContent.setImageResource(artist.id);

        return view;
    }

person bkach    schedule 01.07.2015    source источник
comment
вы извлекаете экземпляр ArtistPacket из списка исполнителей?   -  person Peter P    schedule 01.07.2015
comment
Можете ли вы показать, как вы создаете объект artist?   -  person Dan Harms    schedule 01.07.2015
comment
Вы можете опубликовать весь getView? Какие ошибки вы получаете   -  person Blackbelt    schedule 01.07.2015
comment
Я думаю, что ArtistPacket извлекается из метода getItem(position), и в отладчике отображаются нужные объекты. Я полагаю, что проблема с областью действия? Компилятор позволяет мне манипулировать объектом так, как я считаю нужным — просто без доступа к его атрибутам.   -  person bkach    schedule 01.07.2015


Ответы (1)


Тонкий, но важный ответ на этот вопрос.

Следующее определение класса:

private class ArtistListAdapter<ArtistPacket> extends ArrayAdapter<ArtistPacket>

можно разбить для лучшего понимания.

ArtistListAdapter<ArtistPacket>

Подразумевает, что ArtistListAdapter определяет аргумент типа как ArtistPacket. Это означает, что каждый раз, когда на ArtistPacket ссылаются, он ссылается на это объявление типа, а не на класс, определенный выше.

С другой стороны,

extends ArrayAdapter<ArtistPacket>

Подразумевает, что ArtistListAdapter расширяет ArrayAdapter, который использует вышеупомянутый класс ArtistPacket.

Другими словами, первый ‹> относится к определенным типам, а второй ‹> — к используемым типам.

Таким образом, я использовал следующее объявление:

private class ArtistListAdapter extends ArrayAdapter<ArtistPacket>

Это означает, что ArrayAdapter будет расширять ArtistListAdapter, используя тип ArtistPacket, не запутывая ситуацию определением собственного локального типа ArtistPacket.

Источник

person bkach    schedule 01.07.2015