Android 更新列表中的对象后,ListView未刷新

Android 更新列表中的对象后,ListView未刷新,android,listview,android-listview,Android,Listview,Android Listview,我有一个包含卡片的数组列表。我正在尝试编辑ArrayList中的Cards标记,编辑后,我希望ListView刷新,以便用户可以看到更新的带有新标记的卡片 我在用我的卡。我用它来标记我的卡片 这是卡片的XML 下面是setCurrentTask方法,我在其中更新和刷新列表: private void setCurrentTask(final String backupId, final String currentTaskDescription, final String separator)

我有一个包含卡片的数组列表。我正在尝试编辑ArrayList中的Cards标记,编辑后,我希望ListView刷新,以便用户可以看到更新的带有新标记的卡片

我在用我的卡。我用它来标记我的卡片

这是卡片的XML

下面是setCurrentTask方法,我在其中更新和刷新列表:

private void setCurrentTask(final String backupId, final String currentTaskDescription, final String separator)
{
    int pos = -1;
    for(int i = 0; i<cloudBackupCardList.size(); i++)
    {
        BackupCard backupCard = (BackupCard) cloudBackupCardList.get(i);
        if(backupCard.getId().equals(backupId))
        {
            pos = i;
            Log.d(TAG, "Found the card at position: " + i + " updating it now");
            TagView.Tag[] tags = {new TagView.Tag(currentTaskDescription, Color.BLUE)};
            backupCard.setCurrentTaskDescription(tags, separator);
        }
    }

    if(pos == -1)
        return;

    BackupCard backupCard = (BackupCard) cloudBackupCardList.get(pos);
    Log.d(TAG, "There should be: " + currentTaskDescription + " but found: " + backupCard.getCurrentTaskDescription() + " Thread: " + Thread.currentThread()
            .getName());

    cardListView.setAdapter(new RemoteCardArrayMultiChoiceAdapter(getActivity(), cloudBackupCardList));
//      remoteCardArrayMultiChoiceAdapter.remove(remoteCardArrayMultiChoiceAdapter.getItem(pos));
//      remoteCardArrayMultiChoiceAdapter.insert(backupCard, pos);
//      
////        remoteCardArrayMultiChoiceAdapter.clear();
////        remoteCardArrayMultiChoiceAdapter.addAll(cloudBackupCardList);
//      remoteCardArrayMultiChoiceAdapter.notifyDataSetChanged();
//      cardListView.refreshDrawableState();
}
正如您从logcat中看到的,对象已更新,但在我的终端上的listview中,对象未更新。这使我得出结论,listview没有更新/刷新。不要介意恢复时所有的大写字母,这是意料之中的

//////////////////////编辑////////////////////////////////

这是我在“注释”框中请求的setupInnerViewElements方法

@Override
public void setupInnerViewElements(ViewGroup parent, View view) {

    //Retrieve elements
    titleTextView = (TextView) parent.findViewById(R.id.card_main_inner_simple_title);
    subTitleTextView = (TextView) parent.findViewById(R.id.card_main_inner_simple_sub_title);
    TextView descriptionTextView = (TextView) parent.findViewById(R.id.card_main_inner_simple_description);
    TextView totalContactsTextView = (TextView) parent.findViewById(R.id.card_main_inner_simple_total_contacts);
    tagView = (TagView) parent.findViewById(R.id.tags_view);

    if(isLocal)
    {
        if (titleTextView != null)
            titleTextView.setText(TIMESTAMP_TXT + titleCard); // 1st

        if (subTitleTextView != null)
            subTitleTextView.setText(CONTACTS_COUNT_TXT + subTitleCard); // 2nd

        if(descriptionTextView != null)
            descriptionTextView.setText(RESTORE_COUNT_TXT + description); // 3rd

        if(tagView != null)
        {
            TagView.Tag[] tags = {new TagView.Tag("Wow", Color.TRANSPARENT)};
            tagView.setTags( tags, "" );
        }

        return;
    }

    if (titleTextView != null)
        titleTextView.setText(TIMESTAMP_TXT + titleCard); // 1st

    if (subTitleTextView != null)
        subTitleTextView.setText(PHONE_BRAND_TXT + subTitleCard); // 2nd

    if(descriptionTextView != null)
        descriptionTextView.setText(PHONE_MODEL_TXT + description); // 3rd

    if(totalContactsTextView != null)
        totalContactsTextView.setText(CONTACTS_COUNT_TXT + contactsNumber); // 4th

    if(tagView != null)
    {
        TagView.Tag[] tags = {new TagView.Tag("Wow", Color.TRANSPARENT)};
        tagView.setTags( tags, "" );
    }
}
替换以下行:

cardListView.setAdapter(new RemoteCardArrayMultiChoiceAdapter(getActivity(), cloudBackupCardList));


就这样…

问题根本就不是问题,只需设置标签,标签库就会负责更新CardView。我只是不知道这一点,所以我试图刷新listview

因此,我在我的card类中使用了这个方法:

public void setCurrentTaskDescription(TagView.Tag[] tags, String separator)
{
    tagView.setTags(tags, separator);
}
然后在我的听众身上,我就这样做:

switch ( menuItem.getItemId()) {
            case R.id.action_restore:
                BackupsIntentService.restoreCloudBackup(getActivity(), backupId);
                EventBus.getDefault().post(new 
                setCurrentTask(backupCard, "Restoring...", "");
                break;
}

private void setCurrentTask(final BackupCard backupCard, final String currentTaskDescription, final String separator)
{
    TagView.Tag[] tags = {new TagView.Tag(currentTaskDescription, Color.GREEN)};
    backupCard.setCurrentTaskDescription(tags, separator);
}
不需要刷新列表!
我试图在一杯水里制造一场雷雨。吸取的教训。

只是这样做了,但列表中没有显示更新的卡片。确实,列表似乎有所更新,因为当我向下滚动列表并选择要编辑的卡时,手机会从头开始显示列表,从顶部开始。但是卡片上仍然显示了过时的信息。你能发布你的setupInnerViewElements吗?@GabrieleMariotti我已经编辑了问题并添加了你要求的代码。请检查已编辑的问题。在方法中,您仅更改currentTaskDescription值。但在setupInnerViewElements中,永远不会调用getCurrentTaskDescription方法。我错了吗?@GabrieleMariotti是的,你是对的。我发现了问题所在。这只是一件简单的事情,我把它变成了一个大问题。Android TagView库已经更新了cardView,所以我不需要更新它,所以当我再次尝试更新它时,我正在重置状态。我将发布一个答案并结束这个问题。谢谢你的时间和帮助!这里有一个很棒的图书馆:
cardListView.setAdapter(new RemoteCardArrayMultiChoiceAdapter(getActivity(), cloudBackupCardList));
RemoteCardArrayMultiChoiceAdapter adapter=new RemoteCardArrayMultiChoiceAdapter(getActivity(), cloudBackupCardList));

cardListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
public void setCurrentTaskDescription(TagView.Tag[] tags, String separator)
{
    tagView.setTags(tags, separator);
}
switch ( menuItem.getItemId()) {
            case R.id.action_restore:
                BackupsIntentService.restoreCloudBackup(getActivity(), backupId);
                EventBus.getDefault().post(new 
                setCurrentTask(backupCard, "Restoring...", "");
                break;
}

private void setCurrentTask(final BackupCard backupCard, final String currentTaskDescription, final String separator)
{
    TagView.Tag[] tags = {new TagView.Tag(currentTaskDescription, Color.GREEN)};
    backupCard.setCurrentTaskDescription(tags, separator);
}