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