2014-12-07 95 views
0

我創建了一個Listfragment,它顯示一個視圖列表。 這裏是ListFragment:嘗試訪問ListView的子項時發生Nullpointer異常

public class AroundYou extends ListFragment { 
private int[] images = new int[] { 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin 
}; 

private String[] names = new String[] { 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu"   
}; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 

    // Each row in the list stores country name, currency and flag 
    List<HashMap<String,String>> aList = new ArrayList<HashMap<String,String>>(); 

    for(int i=0;i<10;i++){ 
     HashMap<String, String> hm = new HashMap<String,String>(); 
     hm.put("name", names[i]); 
     hm.put("image",Integer.toString(images[i])); 
     aList.add(hm); 
    } 

    // Keys used in Hashmap 
    String[] from = { "name","image"}; 

    // Ids of views in listview_layout 
    int[] to = { R.id.name,R.id.image}; 

    // Instantiating an adapter to store each items 
    // R.layout.listview_layout defines the layout of each item 
    SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), aList, R.layout.around_you_line_of_list, from, to); 

    setListAdapter(adapter); 

    return super.onCreateView(inflater, container, savedInstanceState); 
} 
} 

ListView中的每一行顯示圖像和文本。這是同一時刻的圖片/文字,但稍後我會放入不同的圖片/文字。 行的XML文件around_you_line_of_list.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

<ImageView 
    android:id="@+id/image" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="2" 
    android:contentDescription="@string/hello_world" 
    android:paddingBottom="10dp" 
    android:paddingRight="10dp" 
    android:paddingTop="10dp" /> 

<TextView 
    android:id="@+id/name" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" /> 

</LinearLayout> 

這工作得很好。但是,我想在ListFragment中修改ListView每一行的圖像。所以我做了onActivityCreated函數。當我調用getChildAt(int)時,我得到了一個N​​ullPointerException異常。爲什麼? 我的意思是,我打電話給ListView AFTER onCreateView,然後我只想:採取此ListView的子視圖,採取此子視圖的視圖,修改imageview。

我如何才能獲得孩子的意見?...

 public void onActivityCreated(Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 
     ListView listView = getListView(); 
     for(int i = 0;i < 10;i++){ 
//I'm getting a null pointer exception at this line . 
      View view = listView.getChildAt(i); 
      ImageView imageview = (ImageView) view.findViewById(R.id.image); 

      BitmapDrawable drawable = (BitmapDrawable)imageview.getDrawable(); 

//here I 'm getting a bitmap from the drawable, and then applying a function that modify 
//the bitmap . 
      Bitmap foreign_image = drawable.getBitmap(); 
      Canvas canvas = null; 
      Bitmap bitmap = setBitmapClippedCircle(foreign_image,200,200,canvas); 
//here I'm putting the result in the imageview . 
      imageview.setImageBitmap(bitmap); 

     } 

    } 

如果你需要更多的代碼(如活動至極正在顯示的片段,或其他的東西),或信息,說給我:)

+0

你見過這樣的人的代碼結構嗎?因爲從我記得(我可能是錯的),listview不支持一些viewgroup函數..好嗎?是的,所以讓我看看 – Elltz 2014-12-07 19:54:37

+0

我真的不明白你的意見。事實上,我用這個教程來做到這一點:http://wptrafficanalyzer.in/blog/android-listfragment-with-images-and-text-using-android-support-library/ 但事實是,我想在將圖像放入列表後修改圖像 – 2014-12-07 20:02:10

回答

0

如果您要修改所呈現的數據,則必須修改支持列表的數據,而不是列表本身。

有三個組件:數據,將數據轉換爲列表視圖可以使用的視圖的適配器,以及基於列表位置向適配器請求視圖的列表視圖本身。

如果您需要更改顯示內容,請更改數據。用新的已更改的數據集更新適配器,然後致電adapter.notifyDatasetChanged()。這將觸發你的列表視圖,以再次從適配器請求數據,因爲它的陳舊。

從你現在在你的代碼中,你可以做兩件事之一。

  • 不是直接使用SimpleAdapter,而是創建一個擴展BaseAdapter並使用它的類。添加一種方法來更改您的數據(例如,setImages(List images)),其中還包括notifyDatasetChanged()的超級呼叫作爲最後一條語句。
  • 用新的數據創建SimpleAdapter的新實例,並使用新的適配器實例再次創建setListAdapter()

第一個是首選,但是tl:Dr;是「不要直接修改你的視圖;它是一個AdapterView,因爲它已經被數據源支持了。」

+0

謝謝。我正在嘗試做第一個。但我很努力的方法 查看getView(int位置,查看convertView,ViewGroup父) 我看不到如何實現它。 – 2014-12-07 21:18:04

+0

@PtitSualty我以前寫過[類似的答案](http://stackoverflow.com/questions/25653905/adapter-update-not-visible-rows/25654089#25654089)。在那裏,我添加了「getView(int,View,ViewGroup)'的存根實現,我希望能解釋每個參數的用途(從我添加的幫助器方法的名稱) – ataulm 2014-12-08 15:05:25

0

你得到一個NullPointerException因爲不是所有的細胞都可見,所以你會得到一個空視圖。

+0

因此,如果我無法訪問它們,如何修改它們?我想我必須讓它們可見。具體來說,我該怎麼做? '因爲當我運行應用程序WHITHOUT onActivityCreated時,我可以看到列表的行(但圖像尚未修改)。所以我認爲他們是可見的。 – 2014-12-07 19:56:01

+0

對不起,我沒有看到你在哪裏得到NPE,看起來更像是你的'ListView'爲null – TheRedFox 2014-12-07 20:01:28

+0

但是如果我不使用onActivityCreated時可以看到所有行(及其元素),它怎麼會是空?我現在很困惑:/ – 2014-12-07 20:10:29

相關問題