2013-07-20 50 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中返回的视图。