2013-07-02 34 views
0

返回null,我開始使用片段來開發新的應用程序,一個片段是ListFragment, 當我使用適配器我提出以顯示列表中的行,我得到一些findViewById,我使用了一些nullgetView()方法。 結構是:findViewByID上BaseAdapter

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 


    <FrameLayout 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:id="@+id/fragment_container"> 
    </FrameLayout> 
</RelativeLayout> 

frag_detail.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@android:id/list" 
     android:layout_gravity="center"/> 
</LinearLayout> 

detail_list_item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/detailItemLayout" > 

    <ImageButton 
     android:layout_width="64dp" 
     android:layout_height="64dp" 
     android:id="@+id/imgIcon" 
     android:layout_below="@+id/txtTitle" 
     android:layout_centerHorizontal="true"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="txtTitle" 
     android:id="@+id/txtTitle" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" 
     android:text="label1" 
     android:id="@+id/label1" 
     android:layout_below="@+id/imgIcon" 
     android:layout_alignParentLeft="true"/> 
</RelativeLayout> 

DetailFragment類

public class DetailFragment extends ListFragment { 

    private Context context; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.frag_detail,container,false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     MonsterDataSource ds = new MonsterDataSource(context); 
     List<Monster> lsMonster = ds.getAllMonsters(); 

     //ListView lsView = (ListView)this.getActivity().findViewById(R.id.lsDetail); 
     MonsterListAdapter adapter = new MonsterListAdapter(context,lsMonster); 
     //lsView.setAdapter(adapter); 
     setListAdapter(adapter); 

    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     context = activity.getApplicationContext(); 
    } 
} 

和類

public class MonsterListAdapter extends BaseAdapter { 
    static class ViewHolder { 
     private TextView txtTitle; 
     private ImageView imgIcon; 
     private TextView txtHealth; 
    } 

    private Context context; 
    private LayoutInflater inflater; 
    private List<Monster> data; 
    private ViewHolder holder; 

    public MonsterListAdapter(Context c, List<Monster> data){ 
     context = c; 
     this.data = data; 
     inflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    /*Basic BaseAdapter Methods*/ 
    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 
     if (view == null) { 
      view = inflater.inflate(R.layout.menu_list_item, null); 
      holder = new ViewHolder(); 



      /*Those Guys get null*/ 
      RelativeLayout layout = (RelativeLayout)view.findViewById(R.id.detailItemLayout); 
      holder.txtTitle = (TextView) view.findViewById(R.id.txtTitle); 
      holder.imgIcon = (ImageView) view.findViewById(R.id.imgIcon); 



      view.setTag(holder); 

     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 


     Monster monster = data.get(i); 

     holder.txtTitle.setText(monster.name); 
     holder.imgIcon.setImageResource(monster.imgResID); 
     holder.txtHealth.setText(monster.health); 

     return view; 
    } 
} 

如果有人問MonsterListAdapter,我試圖找回相對佈局動態後添加一些控件。

感謝

+1

代碼看起來不錯。你能發佈堆棧跟蹤嗎? – Blackbelt

+0

是detail_list_item.xml和menu_list_item.xml兩個不同的文件嗎?然後發佈menu_list_item.xml的內容。 – Egor

回答

4

您發佈的XML爲detail_list_item.xml,但在你的代碼膨脹menu_list_item.xml

detail_list_item.xml包含了所有你正在努力尋找這樣看來你不小心在getView充氣錯誤View

此外,該ID的,你應該刪除您ViewHolder作爲成員變量,並把它作爲一個局部變量getView方法。您正在同一時間重複使用該變量以獲取多個視圖,這意味着您可能會在不同位置修改錯誤的視圖(數據發生錯誤的位置等)。

public View getView(int i, View view, ViewGroup viewGroup) { 
ViewHolder holder; 
... 
...//all of your other code here 
} 
+0

不錯。 +1 :) – Blackbelt

+0

非常好的抓住,先生!謝謝我已經把我的頭撞在牆上 – Markissimo

0

嘗試在不影響「視圖」

RelativeLayout layout = (RelativeLayout)findViewById(R.id.detailItemLayout); 
    holder.txtTitle = (TextView) findViewById(R.id.txtTitle); 
    holder.imgIcon = (ImageView) findViewById(R.id.imgIcon); 

編輯這個工作對我來說...我texviews nbCommentaires和評論給NullPointerException - 如果我誇大查看他們...我想你同樣的問題...

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.comment_row, null); 
     } 
     v.setTag(position); 
     Commentaires o = Global_reco.CommRecos.get(position); 
     if (o != null) {  
      TextView nom = (TextView) v.findViewById(R.id.nom_com); 
      TextView com = (TextView) v.findViewById(R.id.com); 
      ImageView photo = (ImageView) v.findViewById(R.id.profile_com); 
      TextView nbCommentaires = (TextView) findViewById(R.id.nb_commentaires); 
      TextView Comment = (TextView)findViewById(R.id.nbre_comment); 
      photo.setTag(position); 
+2

他在一個適配器。那裏的findViewById不存在。 – dymmeh