2013-10-14 26 views
0

我試圖創建ListFragment。 列表中的每一行都包含圖像和文本。很像this。 我遵循使用ArrayAdapter實現視圖的方法。在LayoutInflater中get null()

但是我卻越來越NullPointerException異常 @LayoutInflater inflater = fragmentContext.getLayoutInflater(null);內getView()ArrayAdapter的

代碼:

一個ArrayAdapter類:

public class MyListAdapter extends ArrayAdapter { 

    Context context; 
    String[] items; 
    Fragment fragmentContext; 

    public MyListAdapter(Context c, int textViewResourceId, String[] listItmes, 
      Fragment fragmentContext) { 
     super(c, textViewResourceId, listItmes); 
      this.items = listItmes; 
     } 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     if (view == null) { 
      LayoutInflater inflater = fragmentContext.getLayoutInflater(null); 
      view.inflate(context, R.layout.my_row, null); 
     } 
     if (items != null) { 
      TextView tv_my_list_item_title = (TextView) view 
        .findViewById(R.id.tv_my_list_item_title); 
      if (tv_my_list_item_title != null) { 
       tv_my_list_item_title.setText(items[position]); 
      } 
     } 
     return view; 
    } 
} 

ListFragment:

public class MyFragment extends ListFragment { 

    int mCurCheckPosition = 0; 
    String[] listItems = null; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.mylayout, null); 
     listItems = getResources().getStringArray(R.array.my_element_list); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     // Populate list with our static array of titles. 
     //ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), 
     //  android.R.layout.simple_list_item_1, listItems); 
     MyListAdapter adapter = new MyListAdapter(getActivity(), R.layout.my_row, listItems, this); 

     setListAdapter(adapter); 

     if (savedInstanceState != null) { // Restore last state for checked position. 
      mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("curChoice", mCurCheckPosition); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     showDetails(position); 
    } 

    private void showDetails(int position) { 
     mCurCheckPosition = position; 
     Toast.makeText(getActivity(), listItems[position], Toast.LENGTH_SHORT).show(); 
    } 

} 

mylayout:

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

    <ListView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/android:list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" > 
    </ListView> 

</LinearLayout> 

my_row:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:orientation="vertical" 
    android:padding="6dp" > 

    <ImageView 
     android:id="@+id/iv_mehr_list_item_icon" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_marginRight="6dp" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:id="@+id/tv_mehr_list_item_title" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:gravity="center_vertical" /> 

</LinearLayout> 

回答

10

使用下面

LayoutInflater inflater ; 
public MyListAdapter(Context c, int textViewResourceId, String[] listItmes, 
      Fragment fragmentContext) { 
      super(c, textViewResourceId, listItmes); 
      this.items = listItmes; 
      inflater = LayoutInfalter.from(c); 
     } 

而且在getView()使用

view = inflater.inflate(R.layout.my_row,parent, false); 

沒有必要在getView初始化吹氣。你需要初始化充氣視圖到view因爲你有View view = convertView然後使用默認的視圖對象來初始化你的文本視圖。

編輯:

此外,我會建議你使用視圖持有者模式

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

+0

感謝,但沒有得到顯示在'TextView'文本。有什麼建議麼? – reiley

+0

我建議你使用視圖持有者模式並在視圖爲空時初始化你的textview。檢查你是否正確初始化了textview,並檢查你的items數組中是否有數據 – Raghunandan

2
Context context; 
    String[] items; 
    Fragment fragmentContext; 

public MyListAdapter(Context c, int textViewResourceId, String[] listItmes, 
      Fragment fragmentContext) { 
     super(c, textViewResourceId, listItmes); 
      this.items = listItmes; 
     } 
    } 

你不分配傳遞到fragmentContext構造函數中的上下文..所以它仍然是空

添加在構造函數中

 this.fragmentContext = fragmentContext;