0

适配器:

public class ServerAdapter extends ArrayAdapter<Server>
{
    private Context Context; 
    private int ResourceId;    
    private List<Server> Data = null;

    public ServerAdapter(Context context, int layoutResourceId, List<Server> data)
    {
        super(context, layoutResourceId, data);
        ResourceId = layoutResourceId;
        Context = context;
        Data = data;
    }

    public void updateServersList(List<Server> newlist)
    {
        Data.clear();
        Data = newlist;
        this.notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View Row = convertView;
        ViewHolder Holder = null;
        Server server = Data.get(position);
        if(Row == null)
        {
            LayoutInflater inflater = ((Activity)Context).getLayoutInflater();
            Row = inflater.inflate(ResourceId, parent, false);

            Holder = new ViewHolder();          
            Holder.Hostname = (TextView)convertView.findViewById(R.id.hostname);
            Holder.Address = (TextView)convertView.findViewById(R.id.address);
            Holder.Players = (TextView)convertView.findViewById(R.id.players);
            Holder.Photo = (ImageView) convertView.findViewById(R.id.imageView1);   
            Row.setTag(Holder);
        }
        else
        {           
            Holder = (ViewHolder) Row.getTag();
        }

        Holder.Hostname.setText(server.getHostname());
        Holder.Address.setText("Address: " + server.getIp() + ":" + server.getPort());
        Holder.Players.setText("Players: " + server.getPlayers() + "/" + server.getMaxPlayers());
        Holder.Photo.setImageResource(server.getGameObject().getImageResId());
        return Row;
    }
}

class ViewHolder
{
   TextView Hostname;
   TextView Address;
   TextView Players;
   ImageView Photo;
}

夏洛克片段:

public class Favourites extends SherlockFragment
{   
    public static ListView FavoritesListView;
    public static ServerAdapter FavoritesAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View v = inflater.inflate(R.layout.servers, null);

        FavoritesListView = (ListView) v.findViewById(R.id.serverlistview);
        FavoritesAdapter = new ServerAdapter(this.getSherlockActivity(), R.layout.server, DataHandler.getUserFavoriteServersFromLocal());        
        FavoritesListView.setAdapter(FavoritesAdapter);
        return v;
    }
}

服务器.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView    
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/serverlistview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
</ListView>

服务器.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    <RelativeLayout
        android:id="@+id/RelativeLayout1"
        android:layout_width="55dp"
        android:layout_height="59dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="6dp"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="55dp"
            android:layout_height="55dp"
            android:layout_marginTop="4dp"
            android:contentDescription="@string/game"
            android:src="@drawable/game" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/relativeLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="0dp"   
        android:layout_toRightOf="@+id/RelativeLayout1"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/hostname"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="0dp"
            android:paddingLeft="5dp"
            android:text="@string/hostname"
            android:textSize="18sp"
            android:textStyle="bold"
            android:ellipsize="end"
            android:singleLine="true" />
    </RelativeLayout>

    <TextView
        android:id="@+id/address"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/relativeLayout2"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/relativeLayout2"
        android:paddingLeft="5dp"
        android:text="@string/address" />

    <TextView
        android:id="@+id/players"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/address"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/address"
        android:paddingLeft="5dp"
        android:text="@string/players" />       
</RelativeLayout>

错误:

07-30 13:11:38.824:E/AndroidRuntime(31423):致命异常:主要 07-30 13:11:38.824:E/AndroidRuntime(31423):java.lang.NullPointerException 07-30 13:11:38.824: E/AndroidRuntime(31423): 在 com.example.app.ServerAdapter.getView(ServerAdapter.java:47) 07-30 13:11:38.824: E/AndroidRuntime(31423): 在 android.widget.AbsListView.obtainView(AbsListView .java:2159) 07-30 13:11:38.824: E/AndroidRuntime(31423): 在 android.widget.ListView.makeAndAddView(ListView.java:1831) ...

4

2 回答 2

1

问题在于片段生命周期的工作方式。在您的 onCreateView 实现中,您在创建适配器时引用了片段的活动。问题是在调用 onActivityCreated 之前,该活动对片段不可用。

如果您查看此处描述的片段生命周期,您可以看到 onCreateView 之后是对 onActivityCreated 的调用。

尝试将一些代码从 onCreateView 移动到 onActivityCreated:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View v = inflater.inflate(R.layout.servers, null);      
    FavoritesListView = (ListView) v.findViewById(R.id.serverlistview);
    return v;
}


@Override
public void onActivityCreated(Bundle savedInstanceState) {


    super.onActivityCreated(savedInstanceState);    

    FavoritesAdapter = new ServerAdapter(this.getSherlockActivity(), R.layout.servers, DataHandler.getUserFavoriteServersFromLocal());       
    FavoritesListView.setAdapter(FavoritesAdapter); 


}   

此外,您似乎在适配器的 getView() 代码中使用了错误的变量。您测试是否 Row==null(这意味着 convertView 也是 null),然后将 Row 分配为新膨胀视图的值。但是,然后您尝试从 convertView 中找到一个子视图,该子视图仍然为空。

尝试编辑适配器的 getView() 方法,如下所示:

    @Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View Row = convertView;
    ViewHolder Holder = null;
    Server server = Data.get(position);
    if(Row == null)
    {
        LayoutInflater inflater = ((Activity)Context).getLayoutInflater();
        Row = inflater.inflate(ResourceId, parent, false);

        Holder = new ViewHolder();          
        //Holder.Hostname = (TextView)convertView.findViewById(R.id.hostname);
        //Holder.Address = (TextView)convertView.findViewById(R.id.address);
        //Holder.Players = (TextView)convertView.findViewById(R.id.players);
        //Holder.Photo = (ImageView) convertView.findViewById(R.id.imageView1);   
        Holder.Hostname = (TextView)Row.findViewById(R.id.hostname);
        Holder.Address = (TextView)Row.findViewById(R.id.address);
        Holder.Players = (TextView)Row.findViewById(R.id.players);
        Holder.Photo = (ImageView)Row.findViewById(R.id.imageView1);  
        Row.setTag(Holder);
    }
    //etc
  }
于 2013-07-30T13:15:43.487 回答
0

可能是因为你用布局膨胀 Row 然后继续使用 convertView 来获取对你的对象的引用?我不知道你的布局如何,只是一个建议。

View Row = convertView;
...
Row = inflater.inflate(ResourceId, parent, false); 
...       
Holder.Hostname = (TextView)convertView.findViewById(R.id.hostname);
于 2013-07-30T11:45:13.200 回答