listview中的Android onItemClicklistener无法正常工作

ReN*_*eNa 2 android

任何人都可以帮我解决我的问题.我有一个TabActivity每个标签触摸打开一个新的活动,这个扩展ListActivity这时我得到我希望通过使用OnItemClickListener可点击的所需项目的列表.

我正在附上我的main.xml,请通过它告诉我是否需要进行任何更改

  <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="5dp">
            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:padding="5dp"/>
            <TextView  
                android:id="@+id/item_title"
                android:layout_width="fill_parent" 
                android:layout_height="wrap_content" 
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:padding="2dp"
                android:textSize="20dp" />
            <TextView  
                android:id="@+id/item_subtitle"
                android:layout_width="fill_parent" 
                android:layout_height="wrap_content" 
                android:padding="2dp"
                android:textSize="13dp" />
        </LinearLayout>
    </TabHost>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

活动

public class TopNewsActivity extends ListActivity
{

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listplaceholder);

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

        String xml = XMLfunctions.getTopNewsXML();
        Document doc = XMLfunctions.XMLfromString(xml);

        int numResults = XMLfunctions.numResults(doc);

        if ((numResults <= 0))
        {
            Toast.makeText(TopNewsActivity.this, "No Result Found", Toast.LENGTH_LONG).show();
            finish();
        }

        NodeList nodes = doc.getElementsByTagName("result");

    for (int i = 0; i < nodes.getLength(); i++) {                           
        HashMap<String, String> map = new HashMap<String, String>();    

        Element e = (Element)nodes.item(i);
        map.put("id", XMLfunctions.getValue(e, "id"));
        map.put("name", "Naam:" + XMLfunctions.getValue(e, "name"));
        map.put("Score", "Score: " + XMLfunctions.getValue(e, "score"));
        mylist.add(map);            
    }       

    ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.main, 
                    new String[] { "name", "Score" }, 
                    new int[] { R.id.item_title, R.id.item_subtitle });

    setListAdapter(adapter);

        final ListView lv = getListView();
        /*lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                @SuppressWarnings("unchecked")
                HashMap<String, String> o = (HashMap<String, String>) lv.getOnItemClickListener();

                Intent i = new Intent(view.getContext(), NewsDetails.class);
                i.putExtra("content_id", o.get("id"));
                i.putExtra("title", o.get("title"));
                startActivity(i);
                lv.setOnItemClickListener(this);

            }
        });*/

        final OnItemClickListener myClickListener = new OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> a, View view, int position, long id)
            {
                @SuppressWarnings("unchecked")
                HashMap<String, String> o = (HashMap<String, String>) lv.getOnItemClickListener();

                Intent i = new Intent(view.getContext(), NewsDetails.class);
                i.putExtra("content_id", o.get("id"));
                i.putExtra("title", o.get("naam"));
                startActivity(i);
            }
        };
        lv.setOnItemClickListener(myClickListener);
    }
}
Run Code Online (Sandbox Code Playgroud)

TabActivity

 public class InfralineTabWidget extends TabActivity{

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Resources res = getResources(); // Resource object to get Drawables
    TabHost tabHost = (TabHost)getTabHost();  // The activity TabHost
    TabHost.TabSpec spec;  // Resusable TabSpec for each tab
    Intent intent;  // Reusable Intent for each tab

    // Create an Intent to launch an Activity for the tab (to be reused)
    intent = new Intent().setClass(this, TopNewsActivity.class);

    // Initialize a TabSpec for each tab and add it to the TabHost
    spec = tabHost.newTabSpec("topNews").setIndicator("Top News", res.getDrawable(R.drawable.tab_news)).setContent(intent);
    tabHost.addTab(spec);

    // Do the same for the other tabs
    intent = new Intent().setClass(this, PowerActivity.class);
    spec = tabHost.newTabSpec("power").setIndicator("Power", res.getDrawable(R.drawable.tab_power)).setContent(intent);
    tabHost.addTab(spec);

    tabHost.setCurrentTab(0);

}

 }
Run Code Online (Sandbox Code Playgroud)

ListPlaceHolder.xml

 <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">    

<ListView
    android:id="@id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:drawSelectorOnTop="false" />

  <TextView
    android:id="@id/android:empty"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="No data"/>
 </LinearLayout>
Run Code Online (Sandbox Code Playgroud)

XMLFunction.java

 package com.infra.android.views;

 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.text.CharacterIterator;
 import java.text.StringCharacterIterator;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpEntity;
  import org.apache.http.HttpResponse;
 import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.w3c.dom.CharacterData;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class XMLfunctions {

public final static Document XMLfromString(String xml){

    Document doc = null;

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    try {

        DocumentBuilder db = dbf.newDocumentBuilder();

        InputSource is = new InputSource();
        is.setCharacterStream(new StringReader(xml));
        doc = db.parse(is); 

    } catch (ParserConfigurationException e) {
        System.out.println("XML parse error: " + e.getMessage());
        return null;
    } catch (SAXException e) {
        System.out.println("Wrong XML file structure: " + e.getMessage());
        return null;
    } catch (IOException e) {
        System.out.println("I/O exeption: " + e.getMessage());
        return null;
    }

    return doc;

}


/** Returns element value
  * @param elem element (it is XML tag)
  * @return Element value otherwise empty String
  */
 public final static String getElementValue( Node elem ) {
     Node kid;
     if( elem != null){
         if (elem.hasChildNodes()){
             for( kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling() ){
                 if( kid.getNodeType() == Node.TEXT_NODE  ){
                     return kid.getNodeValue();
                 }
             }
         }
     }
     return "";
 }

 /*Start Parsing Top News XML*/
 public static String getTopNewsXML(){   
        String line = null;

        try {

            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost("http://p-xr.com/xml");

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            line = EntityUtils.toString(httpEntity);

        } catch (UnsupportedEncodingException e) {
            line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
        } catch (MalformedURLException e) {
            line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
        } catch (IOException e) {
            line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
        }

        return line;

}


public static int numResults(Document doc){     
    Node results = doc.getDocumentElement();
    int res = -1;

    try{
        res = Integer.valueOf(results.getAttributes().getNamedItem("count").getNodeValue());
    }catch(Exception e ){
        res = -1;
    }

    return res;
}

public static String getValue(Element item, String str) {       
    NodeList n = item.getElementsByTagName(str);        
    return XMLfunctions.getElementValue(n.item(0));
}   

   }
Run Code Online (Sandbox Code Playgroud)

rek*_*eru 5

你必须得到ClassCastException,如果不是这样,至少NullPointerException是因为你的监听器代码中的以下行:

HashMap<String, String> o = (HashMap<String, String>) lv.getOnItemClickListener();
Run Code Online (Sandbox Code Playgroud)

你应该把它改成

HashMap<String, String> o = (HashMap<String, String>) adapter.getItem(position);
Run Code Online (Sandbox Code Playgroud)

如果您尝试访问列表项呈示器的基础对象.

编辑

我刚刚尝试了这个应用程序,它可以在我的最终工作(使用虚拟数据,类等)
.但我改变了,是

final ListAdapter adapter = new SimpleAdapter(this, mylist, R.layout.main, 
        new String[] { "title" }, new int[] { R.id.item_title });
setListAdapter(adapter);

getListView().setOnItemClickListener(new OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> a, View view, int position, long id)
    {
        HashMap<String, String> o = (HashMap<String, String>) adapter.getItem(position);

        Intent i = new Intent(TopNewsActivity.this, NewsDetails.class);
        i.putExtra("content_id", o.get("id"));
        i.putExtra("title", o.get("title"));
        startActivity(i);
    }
});
Run Code Online (Sandbox Code Playgroud)

编辑2

新秀错误地关注症状,因为我们确定问题在那里......并非没有,上面的笔记是站立的.

但是只有在采用上面分享的类和布局时,我才意识到,你实际上正在使用你TabView的布局作为你的内部列表的itemrenderer TabView...

main.xml不应该包含那两个TextViews,它们应该在一个单独的xml文件中(例如:) list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView android:id="@+id/item_title" android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium"
        android:padding="2dp" android:textSize="20dp" />
    <TextView android:id="@+id/item_subtitle"
        android:layout_width="fill_parent" android:layout_height="wrap_content"
        android:padding="2dp" android:textSize="13dp" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

main.xml应该看起来像

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TabHost
        android:id="@android:id/tabhost"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="5dp">
            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:padding="5dp"/>
        </LinearLayout>
    </TabHost>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

最后,当您初始化列表适配器时,您应该更改它以使用它list_item.xml:

final ListAdapter adapter =
    new SimpleAdapter(this, mylist, R.layout.list_item, new String[] 
        { "name", "Score" }, new int[] { R.id.item_title, R.id.item_subtitle });
Run Code Online (Sandbox Code Playgroud)

就是这样.

现在它可以工作,并且TabView在每个列表项中没有全新的(没有任何标签),TextViews在主布局中也没有额外的,无用的和不可见的.