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

时间:2014-07-07 13:39:14

标签: android listview android-listview

我的ArrayList包含Card。我正在尝试编辑ArrayList中的Card标记,并且在编辑之后我希望ListView刷新,因此用户可以看到更新的Card,带有新标记。

我使用cardslib作为我的卡片。我使用Android TagView Lib来标记我的卡片。

这里是Card

的XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<ImageView
    android:id="@+id/colorBorder"
    android:layout_width="10dp"
    android:layout_height="@dimen/card_base_empty_height"
    android:layout_marginTop="2dp"
    android:background="@drawable/rectangle" />

<TextView
    (...) />

<TextView
    (...) />

<TextView
    (...) />

<TextView
    (...) />

<pl.charmas.android.tagview.TagView
    android:id="@+id/tags_view"
    android:gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="match_parent" 
    android:layout_below="@id/card_main_inner_simple_total_contacts"
    android:layout_marginLeft="10dp"
    android:layout_alignParentRight="true"
    android:textSize="12sp"/>
</RelativeLayout>

当我尝试编辑和更新列表视图时,这就是:

private final OnClickCardHeaderPopupMenuListener popupMenuListener = new OnClickCardHeaderPopupMenuListener() {
    @Override
    public void onMenuItemClick(BaseCard baseCard, MenuItem menuItem) {

        final String backupId = baseCard.getId();

        switch (menuItem.getItemId()) {
            case R.id.action_restore:
                BackupsIntentService.restoreCloudBackup(getActivity(), backupId);
                Log.d(TAG, "Going to update the card");
                setCurrentTask(backupId, "Restoring...", "");
                break;

            case R.id.action_download:
                BackupsIntentService.downloadCloudBackup(getActivity(), backupId);
                break;

            case R.id.action_delete:
                BackupsIntentService.removeCloudBackup(getActivity(), backupId); 
                break;
        }               
    }
};

这是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输出:

07-07 15:12:59.644: D/CardCloudBackupsFragment(24311): Going to update the card
07-07 15:12:59.644: D/CardCloudBackupsFragment(24311): Found the card at position: 8 updating it now
07-07 15:12:59.656: D/CardCloudBackupsFragment(24311): There should be: Restoring... but found: RESTORING... ThreaD: main

从logcat中可以看到,对象已更新,但在listview中,在我的终端上,它不是。这让我得出结论,列表视图没有更新/刷新。 (不要介意Restoring中的所有大写字母,这是预期的。)

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

以下是评论框中要求的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, "" );
    }
}

2 个答案:

答案 0 :(得分:0)

替换下面的行:

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

RemoteCardArrayMultiChoiceAdapter adapter=new RemoteCardArrayMultiChoiceAdapter(getActivity(), cloudBackupCardList));

cardListView.setAdapter(adapter);
adapter.notifyDataSetChanged();

多数民众赞成......

答案 1 :(得分:0)

问题完全没问题,就像设置标签一样简单,TagsLibrary会负责更新CardView。我只是不知道这一点所以我试图刷新列表视图。

所以我只是在我的卡片类上使用这个方法:

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);
}

无需刷新列表! 我试图在一杯水里面做一场雷雨。经验教训。

相关问题