2015-07-03 64 views
3

我一直在研究一個android項目並陷入了一個問題。我GOOGLE了它,但沒有找到答案。 在我的項目中,有一個名爲viewsurahfragment的片段,它包含一個ID爲lv_showquran的列表視圖。listview getChildAt()返回null

我想突出顯示在指定的索引列表視圖。我正在使用listview.getchildat(),但它返回值爲null
這是viewsurahfragment的代碼。不相關的功能是有效的。

public class ViewSurahFragment extends Fragment 
{ 
    private ListView listView; 
    private int currentSurah; 
    private String surahName; 
    private DatabaseHelper databaseHelper; 
    private ArrayAdapter<String> arrayAdapter; 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) 
    { 
     super.onViewCreated(view, savedInstanceState); 
     //  this.listView = (ListView) getActivity().findViewById(R.id.lv_showQuran); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 
     this.listView = (ListView) getActivity().findViewById(R.id.lv_showQuran); 
    } 

    private void displayAyas() 
    { 
     String[] values = this.getSurahAyas(); 
     this.listView.setItemsCanFocus(true); 
     this.arrayAdapter = new ArrayAdapter<>(this.getActivity().getApplicationContext(), R.layout.layout_surah_ayah, values); 

     this.listView.setAdapter(this.arrayAdapter); 
     this.listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
     { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
      { 
      } 
     }); 

     registerForContextMenu(this.listView); 
    } 

    public void highlightAyah(int ayahNum) 
    { 
     TextView view = (TextView) this.listView.getChildAt(ayahNum - 1); 
     Log.i("ViewSurahFragment", "List View Child Counts Are: " + this.listView.getChildCount()); 

     if(view == null) 
      Log.i("ViewSurahFragment", "view is null"); 
    } 
} 

不要梅特我是否使用的代碼以下行無論是在onactivitycreatedonviewcreated,它返回在highlightayah函數調用listview.getchildat()無效。

this.listView = (ListView) getActivity().findViewById(R.id.lv_showQuran); 

我也試着做下面的事,但它也沒有爲我工作。

ListView view = (ListView) getActivity().findViewById(R.id.lv_showQuran); 
TextView v = (TextView) view.getChildAt(ayahNum); 
Log.i("ViewSurahFragment", "List View Child Counts Are: " + view.getChildCount()); 

if(v == null) 
    Log.i("ViewSurahFragment", "view is null"); 

但對我來說,有趣的是,getchildviewcount() return 0在任何解決方案,我用,但項目顯示在列表視圖。
有誰可以請告訴我我在哪裏做錯了。
在此先感謝您的幫助。

+0

[大寫字母](https://en.wikipedia.org/wiki/Capitalization_in_English)上每個單詞都很難閱讀... – 2Dee

+0

對不起,我有一個這樣做的壞習慣。我希望有一天我會擺脫這個問題。我正在編輯我的帖子,並嘗試刪除capatilization。謝謝指出。 –

+0

沒問題,mate,英文不是每個人的母語,實際上它也不是我的;)無論如何,感謝編輯!關於你的問題,你爲什麼要在Activity的佈局中尋找ListView?你在哪裏打電話public void highlightAyah(int ayahNum)?你如何確保你用一個小於列表內容的數字來調用該方法? – 2Dee

回答

8

這會產生空:

TextView textView = (TextView) listView.getChildAt(0); 
Log.i("item", textView.getText().toString()); 

這並不:

TextView textView = (TextView) listView.getAdapter().getView(0, null, listView); 
    Log.i("item", textView.getText().toString()); 

本例使用android.R.layout.simple_list_item_1所以請記住,TextView的是simple_list_item_1管理根視圖。

+0

謝謝。這個工作。這裏是工作代碼。 TextView view =(TextView)this.listView.getAdapter()。getView(ayahNum - 1,null,this.listView); view.setBackgroundColor(Color.WHITE); Log.i(「ViewSurahFragment」,「List View Child Counts Are:」+ this.listView.getAdapter()。getCount()); if(view == null) Log.i(「ViewSurahFragment」,「view is null」); 但現在我陷入了另一個問題。查看背景顏色不會變成白色。 :-( –

+0

那麼我現在只能提出一個建議,就是在它自己的適配器中定義選擇。這樣你就可以設置textview在getView()方法中有白色背景(在那裏你可以檢查項目是否被選中)。 – JuliusScript

0

所以,當你打電話給getChildCount() - 你的listView是空的。看起來像你在將內容放入其中之前使用displayAyas()方法調用它。

檢查在哪裏調用displayAyas()。因爲項目顯示 - 我想它被稱爲活動的某處。把它放在getChildCount()之前。

+0

'displayAyas()'總是在'highlightAyah'之前被調用,活動。如果你想我可以在這裏分享完整的代碼。 –

+0

@ RedPrince007嘗試這種方法來獲取視圖:http://stackoverflow.com/a/24864536/2448244 – Ydjeen

+0

我得到了問題的解決方案。解決方案由@Julius發佈,我將其標記爲答案。無論如何謝謝你的回覆Ydjeen –

1
private void highlightListView(int position) 
{ 

    try 
    { 
     int i = 0; 
     int count2 = alAudio.size(); 
     for (i = 0; i < count2; i++) 
     { 

      View view = lstvwSongs.getChildAt(i - lstvwSongs.getFirstVisiblePosition()); 
      ViewHolder viewHolder = (ViewHolder) lstvwSongs.getAdapter().getView(i, view, lstvwSongs).getTag(); 

       if (i == position) 
       { 
        viewHolder.txtvwTitle.setTextColor(color_item_highlight); 
       } 
       else 
       { 
        viewHolder.txtvwTitle.setTextColor(color_item_normal); 
       } 
     }   
    } 
    catch (Exception e) 
    {   
     e.printStackTrace(); 
    } 
} 

這是高亮listview項目的最簡單方法。

我希望這可以幫助你。

相關問題