在 Android 上从 ListView 中删除特定项目
Removing specific items from ListView on Android
我正在为 Android 开发一个应用程序,它将 RSS 数据从给定的 URL 下载到 ListView,我可以在其中以多种方式对项目进行排序(按字母顺序、按日期、按标题等)。
我希望能够删除从给定 URL 下载的所有项目。
排序会改变原始项目的位置,所以我不能简单地按位置删除项目。
在这里我详细解释它是如何工作的:
- 在片段 A 中,我有一个 EditText,您可以在其中键入 URLs。
- 按 ENTER 后:
- URL 通过接口传递给片段 B,它使用 URL 下载 XML 数据并通过'item' class 类型的 ArrayAdapter。
- 片段 A 有自己的 ListView,它存储接受的 URLs 以及旁边的 >delete< 按钮。
加载到片段的 B ListView 中的每个 RSS 项目都有唯一的标题、link、描述和发布日期。
这意味着加载的项目中没有公共值。
我确实下载了 "channel" 部分,它是从给定 URL 下载的所有 "item" 的 parent,但我没有在片段的 B 适配器中使用它.
这是 POJO 的代码:
@Root(name = "rss", strict = false)
public class RSS {
@Element
private Channel channel;
@Attribute
private String version;
public Channel getChannel() {
return channel;
}
}
@Root(name = "channel", strict = false)
public class Channel {
@ElementList(name = "item", inline = true)
List<Article> articleList;
@Element
private String title;
@Element
private String link;
@Element
private String description;
// setters and getters
}
@Root(name = "item", strict = false)
public class Article {
@Element
private String title;
@Element
private String description;
@Element
private String link;
@Element(required = false)
private String author;
@Element(required = false)
private String pubDate;
// setters and getters
}
这是用于在片段 A 的 ListView 适配器中存储 URL 的 URL class。
public class URL {
private String url;
URL(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public void setUrl(String title) {
this.url = title;
}
}
现在,片段 B 下载 RSS object(此处称为 'articles'),这就是我将项目加载到另一个 ListView 适配器的方式:
previewList = articles.getChannel().articleList;
adapter.addTop(previewList);
adapter.notifyDataSetChanged();
最后,Fragment B 的 ListView 适配器:
public class ArticlePreviewAdapter extends ArrayAdapter<Article> {
List<Article> articlePreviewItems;
public ArticlePreviewAdapter(Activity activity, List<Article> articlePreviewItems) {
super(activity, R.layout.item_article_preview, articlePreviewItems);
this.articlePreviewItems = articlePreviewItems;
}
private static class ViewHolder {
TextView articlePreviewTitle;
TextView articlePreviewLink;
TextView articlePreviewDescription;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
Article articlePreviewItem = getItem(position);
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.item_article_preview, parent, false);
viewHolder.articlePreviewTitle = (TextView) convertView.findViewById(R.id.articleTitle);
viewHolder.articlePreviewLink = (TextView) convertView.findViewById(R.id.articleLink);
viewHolder.articlePreviewDescription = (TextView) convertView.findViewById(R.id.articleDescription);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.articlePreviewTitle.setText(articlePreviewItem.getTitle());
viewHolder.articlePreviewLink.setText(articlePreviewItem.getLink());
viewHolder.articlePreviewDescription.setText(articlePreviewItem.getDescription());
return convertView;
}
public void removeChannelItems(what do) {
what do?
}
public void addTop(List<Article> articles) {
articlePreviewItems.addAll(0, articles);
}
}
提前感谢您的帮助。
如果您的 Article
对象(或 RSS
,或 Channel
)可以保存对许多 URL
的引用,您可以像下面这样实现关联(Article
为例)
public class URL {
private String url;
private ArrayList<String> articleTitles;
public class URL(){
this.articleTitles = new ArrayList<String>();
}
public void setArticleTitles(String articleTitle){
this.articleTitle.add(articleTitle);
}
public ArrayList<String> getAarticleTitles(){
return this.articleTitles;
}
URL(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public void setUrl(String title) {
this.url = title;
}
}
然后您将 URL
引用您的对象。当您删除 URL
时,您会从相应的 adapter
中删除所有 Articles
,最后在 adapter
上调用 notifyDataSetChanged();
。
我正在为 Android 开发一个应用程序,它将 RSS 数据从给定的 URL 下载到 ListView,我可以在其中以多种方式对项目进行排序(按字母顺序、按日期、按标题等)。
我希望能够删除从给定 URL 下载的所有项目。 排序会改变原始项目的位置,所以我不能简单地按位置删除项目。
在这里我详细解释它是如何工作的:
- 在片段 A 中,我有一个 EditText,您可以在其中键入 URLs。
- 按 ENTER 后:
- URL 通过接口传递给片段 B,它使用 URL 下载 XML 数据并通过'item' class 类型的 ArrayAdapter。
- 片段 A 有自己的 ListView,它存储接受的 URLs 以及旁边的 >delete< 按钮。
加载到片段的 B ListView 中的每个 RSS 项目都有唯一的标题、link、描述和发布日期。
这意味着加载的项目中没有公共值。 我确实下载了 "channel" 部分,它是从给定 URL 下载的所有 "item" 的 parent,但我没有在片段的 B 适配器中使用它.
这是 POJO 的代码:
@Root(name = "rss", strict = false)
public class RSS {
@Element
private Channel channel;
@Attribute
private String version;
public Channel getChannel() {
return channel;
}
}
@Root(name = "channel", strict = false)
public class Channel {
@ElementList(name = "item", inline = true)
List<Article> articleList;
@Element
private String title;
@Element
private String link;
@Element
private String description;
// setters and getters
}
@Root(name = "item", strict = false)
public class Article {
@Element
private String title;
@Element
private String description;
@Element
private String link;
@Element(required = false)
private String author;
@Element(required = false)
private String pubDate;
// setters and getters
}
这是用于在片段 A 的 ListView 适配器中存储 URL 的 URL class。
public class URL {
private String url;
URL(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public void setUrl(String title) {
this.url = title;
}
}
现在,片段 B 下载 RSS object(此处称为 'articles'),这就是我将项目加载到另一个 ListView 适配器的方式:
previewList = articles.getChannel().articleList;
adapter.addTop(previewList);
adapter.notifyDataSetChanged();
最后,Fragment B 的 ListView 适配器:
public class ArticlePreviewAdapter extends ArrayAdapter<Article> {
List<Article> articlePreviewItems;
public ArticlePreviewAdapter(Activity activity, List<Article> articlePreviewItems) {
super(activity, R.layout.item_article_preview, articlePreviewItems);
this.articlePreviewItems = articlePreviewItems;
}
private static class ViewHolder {
TextView articlePreviewTitle;
TextView articlePreviewLink;
TextView articlePreviewDescription;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
Article articlePreviewItem = getItem(position);
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.item_article_preview, parent, false);
viewHolder.articlePreviewTitle = (TextView) convertView.findViewById(R.id.articleTitle);
viewHolder.articlePreviewLink = (TextView) convertView.findViewById(R.id.articleLink);
viewHolder.articlePreviewDescription = (TextView) convertView.findViewById(R.id.articleDescription);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.articlePreviewTitle.setText(articlePreviewItem.getTitle());
viewHolder.articlePreviewLink.setText(articlePreviewItem.getLink());
viewHolder.articlePreviewDescription.setText(articlePreviewItem.getDescription());
return convertView;
}
public void removeChannelItems(what do) {
what do?
}
public void addTop(List<Article> articles) {
articlePreviewItems.addAll(0, articles);
}
}
提前感谢您的帮助。
如果您的 Article
对象(或 RSS
,或 Channel
)可以保存对许多 URL
的引用,您可以像下面这样实现关联(Article
为例)
public class URL {
private String url;
private ArrayList<String> articleTitles;
public class URL(){
this.articleTitles = new ArrayList<String>();
}
public void setArticleTitles(String articleTitle){
this.articleTitle.add(articleTitle);
}
public ArrayList<String> getAarticleTitles(){
return this.articleTitles;
}
URL(String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public void setUrl(String title) {
this.url = title;
}
}
然后您将 URL
引用您的对象。当您删除 URL
时,您会从相应的 adapter
中删除所有 Articles
,最后在 adapter
上调用 notifyDataSetChanged();
。