2013-07-30 26 views
0

適配器:列表視圖定製適配器將不SherlockFragment內工作

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

SherlockFragment:

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

servers.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> 

server.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):at com.example.app.ServerAdapter.getView(ServerAdapter.java:47) 07-30 13:11:38.824:E/AndroidRuntime(31423):at android.widget.AbsListView.obtainView(AbsListView.java:2159)07-30 13:11:38.824:E/AndroidRuntime(31423):at android.widget.ListView.makeAndAddView(ListView。 java:1831) 。 ..

+0

哪條線是'ServerAdapter.java' 47? – esentsov

+0

Holder.Hostname =(TextView)convertView.findViewById(R.id.hostname); – filippo

回答

1

該問題是由於片段生命週期的工作原理。在您的onCreateView實現中,您可以在創建適配器時引用片段的活動。問題在於,除非調用onActivityCreated,否則該活動不可用於片段。

如果你看看fragment lifecycle as described here,你可以看到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 
    } 
+0

它仍然無法正常工作... 它可能是我的佈局有問題嗎?我在第一篇文章中添加了xml文件 – filippo

+0

@ user824963我已經更新了我的答案。在我之前回答的ernestofndz是在正確的軌道上。 – pdriegen

+0

現在,它的工作,謝謝 – filippo

0

可能是因爲你膨脹行與佈局,然後繼續使用convertView來獲取對象的引用?我不知道你的佈局如何,只是一個建議。

View Row = convertView; 
... 
Row = inflater.inflate(ResourceId, parent, false); 
...  
Holder.Hostname = (TextView)convertView.findViewById(R.id.hostname);