2013-07-20 53 views
3

我不得不改變一個類從它被分類爲一個活動片段,我不知道現在如何設置它,因爲它現在說它無法解決我的findViewById方法。如果需要,可以給出任何額外的代碼。感謝您的幫助。如何在片段和ArrayList中使用findViewById無法應用 - Android

public class CustomizedListView extends Fragment { 
// All static variables 
static final String URL = "http://api.androidhive.info/music/music.xml"; 
// XML node keys 
static final String KEY_SONG = "song"; // parent node 
static final String KEY_ID = "id"; 
static final String KEY_TITLE = "title"; 
static final String KEY_ARTIST = "artist"; 
static final String KEY_DURATION = "duration"; 
static final String KEY_THUMB_URL = "thumb_url"; 

ListView list; 
LazyAdapter adapter; 

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

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


    ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 

    XMLParser parser = new XMLParser(); 
    String xml = parser.getXmlFromUrl(URL); // getting XML from URL 
    Document doc = parser.getDomElement(xml); // getting DOM element 

    NodeList nl = doc.getElementsByTagName(KEY_SONG); 
    // looping through all song nodes <song> 
    for (int i = 0; i < nl.getLength(); i++) { 
     // creating new HashMap 
     HashMap<String, String> map = new HashMap<String, String>(); 
     Element e = (Element) nl.item(i); 
     // adding each child node to HashMap key => value 
     map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
     map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE)); 
     map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST)); 
     map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION)); 
     map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL)); 

     // adding HashList to ArrayList 
     songsList.add(map); 
    } 


    list=(ListView)findViewById(R.id.game_list); 

    // Getting adapter by passing xml data ArrayList 
    adapter=new LazyAdapter(this, songsList); 
    list.setAdapter(adapter); 


    // Click event for single list row 
    list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 


     } 
    }); 
} 
} 

這是什麼原因造成了我與findViewById麻煩,因爲它不能解析的方法:

list=(ListView)findViewById(R.id.game_list); 

這是什麼原因造成了我的問題在ArrayList和顯然這是因爲LazyAdapter(機器人.app.Activity,在LazyAdapter的ArrayList>)不能被施加到(com.example.app.CustomizedListView,ArrayList的>)

 // Getting adapter by passing xml data ArrayList 
    adapter=new LazyAdapter(this, songsList); 
    list.setAdapter(adapter); 

main.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="vertical" 
android:background="#e5e5e5" > 

<ListView 
    android:id="@+id/game_list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:divider="#e5e5e5" 
    android:dividerHeight="6dp" 
    android:background="#e5e5e5" 
    android:layout_marginLeft="6dp" 
    android:layout_marginRight="6dp"/> 

</LinearLayout> 

回答

0

你最好

final View v = inflater.inflate(R.layout.your_layout_with_list, container, false); 
findViewById(id) 

此:

getActivity().findViewById(id) 

活動將是空連接到活動之前。

+0

是什麼?列表=(ListView中)getActivity()findViewById(R.id.game_list)。 – ThePoloDoc

4

您的錯誤是在方法onCreate:視圖創建必須繼續方法onCreateView來代替。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // Preparing user interface 
    final View v = inflater.inflate(R.layout.main, container, false); 
    final ListView = (ListView) v.findViewById(R.id.game_list); 
    // Do what you want... 

    return v; 
} 

...是因爲LazyAdapter(android.app.Activity,ArrayList的>)在 LazyAdapter不能被應用到(com.example.app.CustomizedListView, 的ArrayList>)

你對你的問題有了解。恕我直言,你必須改變你使用LazyAdapter的方式。我建議你:檢查我的代碼是否用Fragment解決了你的問題,然後問一個關於ArrayList/LazyAdapter問題的問題。

+0

我將如何將其放在我的代碼中。我出於某種原因在這裏混淆,我的大腦不工作。 – ThePoloDoc

+0

暫停10分鐘,然後返回並執行此操作:而不是在方法「onCreate」上創建ListView,像在我的代碼中那樣在「onCreateView」上執行。你有res/layout文件夾中的layout.xml嗎? – JJ86

+0

它告訴我你創建ListView的代碼不是一個聲明。 – ThePoloDoc

2

是的,使用getActivity()。findViewById(id),但前提是您知道該片段確實附加到某個活動。如果不是,getActivity()將返回null。

另一種方法是在片段內的視圖上調用findViewById,例如,您在onCreateView中返回的視圖。