在 Android 上从 ListView 中删除特定项目

Removing specific items from ListView on Android

我正在为 Android 开发一个应用程序,它将 RSS 数据从给定的 URL 下载到 ListView,我可以在其中以多种方式对项目进行排序(按字母顺序、按日期、按标题等)。

我希望能够删除从给定 URL 下载的所有项目。 排序会改变原始项目的位置,所以我不能简单地按位置删除项目。

在这里我详细解释它是如何工作的:

  1. 在片段 A 中,我有一个 EditText,您可以在其中键入 URLs。
  2. 按 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();