Java 单击时如何使用侦听器展开listView?

Java 单击时如何使用侦听器展开listView?,java,android,Java,Android,我目前正在完成一项课程作业,需要使用android解析XML文件,并在android手机上以有用的格式显示其数据 我使用了XmlPullParser,并成功地将文件解析为listView。 结果如下: 为了改进上面的布局,我将程序设置为仅显示标题(即A78 Seamill等),当用户单击标题时,我希望与作品相关的信息显示为下拉列表 在MainActivity.java类中,我有一个setOnItemClickListener,如下所示: listView.setOnItemClickL

我目前正在完成一项课程作业,需要使用android解析XML文件,并在android手机上以有用的格式显示其数据

我使用了XmlPullParser,并成功地将文件解析为listView。 结果如下:

为了改进上面的布局,我将程序设置为仅显示标题(即A78 Seamill等),当用户单击标题时,我希望与作品相关的信息显示为下拉列表

在MainActivity.java类中,我有一个setOnItemClickListener,如下所示:

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

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

            item.setExpand(true);


        }
    });
我希望当我的侦听器将布尔值“expand”设置为true时,我的toString方法将返回额外的信息

我知道第一条建议是使用expandableListView。我已经尝试过此方法,但不幸的是,由于我检索数据的方式,此方法不起作用:

List<Item> items = null;
    try {
        XmlPullParserHandler parser = new XmlPullParserHandler();
        items = parser.parse(getAssets().open("data.xml"));
        ArrayAdapter<Item> adapter =
                new ArrayAdapter<Item>(this,R.layout.list_item, items);
        listView.setAdapter(adapter);
    } catch (IOException e) {
        e.printStackTrace();
    }

您应该使用RecyclerView而不是ListView。然后,可以使用ItemAnimator来处理插入动画。然后,您所要做的就是调用notifyItemInserted以产生所需的效果

教程:

在Item.java中,您实现了toString()方法,并在该toString()中检查是否扩展文本

唯一缺少的是在调用setExpand()后刷新列表适配器。要刷新列表适配器,需要调用notifyDataSetChanged()

最终阵列适配器=
新阵列适配器(此,R.layout.list_项,项);
setAdapter(适配器);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
int位置,长标题){
items.get(position).setExpand(true);
adapter.notifyDataSetChanged();
}
});

您看过ExpandableListView吗?@Jimmy在编写在线教程中的简单ExpandableListView之前,我已经看过了您提供的页面。不幸的是,示例项目硬编码了arraylist子级和父级,这在我尝试将问题应用于其场景时造成了问题。@PatrickLafferty您可以发布您的ArrayAdapter类吗?@AungSiMinHtet我没有ArrayAdapter类,但我有一个XmlPullParserHandler类。我希望我的更新能有所帮助。Thanks@PatrickLafferty我已经提出了我的答案,兄弟。请试一试。对于所有有相同问题的人,请注意这是有效的。还要确保你没有遗漏项目。获取(位置),以便onClickListener知道你正在谈论的项目@AungSiMinHtet你是一个天才-我真的在为此奋斗。我很高兴知道这对你有帮助
List<Item> items = null;
    try {
        XmlPullParserHandler parser = new XmlPullParserHandler();
        items = parser.parse(getAssets().open("data.xml"));
        ArrayAdapter<Item> adapter =
                new ArrayAdapter<Item>(this,R.layout.list_item, items);
        listView.setAdapter(adapter);
    } catch (IOException e) {
        e.printStackTrace();
    }
package com.example.traffic2;


import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Patrick Lafferty on 26/02/2018.
 */



public class XmlPullParserHandler {

List<Item> items;
private Item item;
private String text;



public XmlPullParserHandler() {
    items = new ArrayList<Item>();
}

public List<Item> getItems() {
    return items;
}


public List<Item> parse(InputStream is) {
    XmlPullParserFactory factory = null;
    XmlPullParser parser = null;
    try {
        factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        parser = factory.newPullParser();

        parser.setInput(is, null);

        int eventType = parser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            String tagname = parser.getName();
            switch (eventType) {
                case XmlPullParser.START_TAG:
                    if (tagname.equalsIgnoreCase("item")) {
                        // create a new instance of item
                        item = new Item();

                    }
                    break;

                case XmlPullParser.TEXT:
                        text = parser.getText();

                    break;

                case XmlPullParser.END_TAG:
                    if (tagname.equalsIgnoreCase("item")) {
                        // add employee object to list
                        items.add(item);

                    }else if (tagname.equalsIgnoreCase("title")) {
                            item.setTitle(text);

                    } else if (tagname.equalsIgnoreCase("description")) {
                        item.setDescription(text);

                    } else if (tagname.equalsIgnoreCase("link")) {
                        item.setLink(text);
                    } else if (tagname.equalsIgnoreCase("pubData")) {
                        item.setPubDate(text);
                    } else if (tagname.equalsIgnoreCase("georsspoint")) {
                        item.setGeorsspoint(text);
                    }
                    break;

                default:
                    break;
            }
            eventType = parser.next();
        }

    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return items;
}

}
package com.example.traffic2;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Patrick Lafferty on 01/03/2018.
 */

public class Item {

private String title;
private String description;
private String link;
private String georsspoint;
private String pubDate;
private boolean expand = false;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getLink() {
    return link;
}

public void setLink(String link) {
    this.link = link;
}

public String getGeorsspoint() {
    return georsspoint;
}

public void setGeorsspoint(String georsspoint) {
    this.georsspoint = georsspoint;
}

public String getPubDate() {
    return pubDate;
}

public void setPubDate(String pubDate) {
    this.pubDate = pubDate;
}


public boolean getExpand() {
    if (expand == false) {
        return expand = false;
    } else {
        return expand = true;
    }
}

public void setExpand(boolean expand) {
    this.expand = expand;
}

@Override
public String toString() {
    String s = "";
    if (getExpand() == true) {
        s = title + "\n" + description + "\n" + link + "\n" + georsspoint + "\n" + pubDate;
    } else if (getExpand() == false) {
        s = title;
    }
    return s;
}
} 
final ArrayAdapter<Item> adapter =
            new ArrayAdapter<Item>(this,R.layout.list_item, items);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

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

        items.get(position).setExpand(true);
        adapter.notifyDataSetChanged();

    }
});