列表适配器中的自定义类

时间:2015-07-01 16:01:17

标签: java android oop listadapter

我在理解范围如何影响我的代码时遇到了一些麻烦。我似乎无法访问公共类的公共属性。

我创建了一个自定义类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);

...

然后我定义了ArtistListAdaptergetView

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对象中的idArtistPacket(在本例中为artist)。所以我试着打电话

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

但是我收到编译错误。在调试器中,似乎完整对象即将到来 - 它似乎并不像适配器访问nameid属性。

我得到的错误是:

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;
    }

1 个答案:

答案 0 :(得分:2)

对此的微妙但重要的答案。

以下类定义:

private class ArtistListAdapter<ArtistPacket> extends ArrayAdapter<ArtistPacket>

可以分解以便更好地理解。

ArtistListAdapter<ArtistPacket>

意味着ArtistListAdapter 类型参数定义为ArtistPacket。这意味着无论何时引用ArtistPacket,它都会引用此类型声明 - 而不是上面定义的类。

另一方面,

extends ArrayAdapter<ArtistPacket>

意味着ArtistListAdapter扩展了ArrayAdapter 使用上述ArtistPacket类。

换句话说,第一个&lt;&gt;是关于定义的类型,而第二个&lt;&gt;是关于使用的类型。

因此,我使用了以下声明:

private class ArtistListAdapter extends ArrayAdapter<ArtistPacket>

这意味着ArrayAdapter将使用类型ArtistListAdapter扩展ArtistPacket - 通过定义它自己的本地ArtistPacket类型而不会混淆情况。

Source