Android 刷新列表视图中的特定项

Android 刷新列表视图中的特定项,android,listview,listviewitem,partial-page-refresh,Android,Listview,Listviewitem,Partial Page Refresh,我试图在不刷新整个listview的情况下更新列表视图中的特定项(下面有详细说明)。对于这个要求,我放弃了几乎所有的在线想法,但我没有得到解决方案 说明: 我在列表视图中有不同的项目(见附图)。对于这个列表视图,我使用模型类(POJO类)存储id和其他相关数据。在同一个项目中,我使用推送通知。在这个推送通知中,我将获得列表视图中的项目id。根据id,我必须在列表视图中显示一些图像。对于这个要求,如果我刷新整个列表视图,我可以更改图像,但我不想刷新整个列表视图因此,我想根据从推送通知中获得的id更

我试图在不刷新整个listview的情况下更新列表视图中的特定项(下面有详细说明)。对于这个要求,我放弃了几乎所有的在线想法,但我没有得到解决方案

说明:

我在列表视图中有不同的项目(见附图)。对于这个列表视图,我使用模型类(POJO类)存储id和其他相关数据。在同一个项目中,我使用推送通知。在这个推送通知中,我将获得列表视图中的项目id。根据id,我必须在列表视图中显示一些图像。对于这个要求,如果我刷新整个列表视图,我可以更改图像,但我不想刷新整个列表视图因此,我想根据从推送通知中获得的id更改列表视图中特定项目的图像

图像

示例代码(我正在使用休闲示例代码填充列表视图)

活动


您可以使用以下代码:

private void updateView(int index){
    View v = yourListView.getChildAt(index - 
        yourListView.getFirstVisiblePosition());

    if(v == null)
       return;

    // Views you want to change
    TextView someText = (TextView) v.findViewById(R.id.sometextview);
    someText.setText("UPDATE");
}

我努力实现这一目标,但正如我提到的,这是不可能实现的(截至目前)。所以,我做到了这一点

解释

当我收到推送通知时,我只需调用包含我的ListView值的API并维护ListView位置,如下面的代码所示。在此API调用期间,我没有显示任何进度对话框

Parcelable state;

@Override
public void onPause() {    
    // Save ListView state @ onPause
    Log.d(TAG, "saving listview state @ onPause");
    state = listView.onSaveInstanceState();
    super.onPause();
}
...

@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    // Set new items
    listView.setAdapter(adapter);
    ...
    // Restore previous state (including selected item index and scroll position)
    if(state != null) {
        Log.d(TAG, "trying to restore listview state..");
        listView.onRestoreInstanceState(state);
    }
}

请将此简化为一个简短但完整的示例来演示问题。不需要这么多代码
public class EventMyEventHostingItems {

    private String eventID;
    private String imageMyEvent;
    private String isActive;
    private String titleMyEvent;
    private String timeMyEvent;
    private String locationMyEvent;
    private String interestedMyEvent;





    public String getEventID() {
        return eventID;
    }
    public void setEventID(String eventID) {
        this.eventID = eventID;
    }
    public String getIsActive() {
        return isActive;
    }
    public void setIsActive(String isActive) {
        this.isActive = isActive;
    }
    public String getImageMyEvent() {
        return imageMyEvent;
    }
    public void setImageMyEvent(String imageMyEvent) {
        this.imageMyEvent = imageMyEvent;
    }
    public String getTitleMyEvent() {
        return titleMyEvent;
    }
    public void setTitleMyEvent(String titleMyEvent) {
        this.titleMyEvent = titleMyEvent;
    }
    public String getTimeMyEvent() {
        return timeMyEvent;
    }
    public void setTimeMyEvent(String timeMyEvent) {
        this.timeMyEvent = timeMyEvent;
    }
    public String getLocationMyEvent() {
        return locationMyEvent;
    }
    public void setLocationMyEvent(String locationMyEvent) {
        this.locationMyEvent = locationMyEvent;
    }
    public String getInterestedMyEvent() {
        return interestedMyEvent;
    }
    public void setInterestedMyEvent(String interestedMyEvent) {
        this.interestedMyEvent = interestedMyEvent;
    }
}
private void updateView(int index){
    View v = yourListView.getChildAt(index - 
        yourListView.getFirstVisiblePosition());

    if(v == null)
       return;

    // Views you want to change
    TextView someText = (TextView) v.findViewById(R.id.sometextview);
    someText.setText("UPDATE");
}
Parcelable state;

@Override
public void onPause() {    
    // Save ListView state @ onPause
    Log.d(TAG, "saving listview state @ onPause");
    state = listView.onSaveInstanceState();
    super.onPause();
}
...

@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    // Set new items
    listView.setAdapter(adapter);
    ...
    // Restore previous state (including selected item index and scroll position)
    if(state != null) {
        Log.d(TAG, "trying to restore listview state..");
        listView.onRestoreInstanceState(state);
    }
}