글쓴이 보관물: 소장 마

안드로이드 목록보기를 새로 고치는 방법? 후 Android를 새로 고치는 방법은

ListView동적 데이터를 추가 / 삭제 한 후 Android를 새로 고치는 방법은 무엇입니까?



답변

해당 어댑터의 데이터를 수정 한 후 객체를 호출 notifyDataSetChanged()하십시오 Adapter.

전화 방법 / 통화 방법에 대한 추가 정보 notifyDataSetChanged()이 Google I / O 비디오 에서 볼 수 있습니다 .


답변

또한 이것을 사용할 수 있습니다 :

myListView.invalidateViews();


답변

모든 무시하십시오 invalidate(), invalidateViews(), requestLayout()이 질문에 대한 … 답변을.

올바른 일을 할 (그리고 다행히도도 정답으로 표시)하는 것입니다 전화 notifyDataSetChanged()어댑터에 .

문제 해결

호출 notifyDataSetChanged()이 작동하지 않으면 모든 레이아웃 방법이 도움이되지 않습니다. 나를 ListView제대로 업데이트 했다고 믿습니다 . 차이점을 찾지 못하면 어댑터의 데이터 위치를 확인해야합니다.

이 컬렉션이 메모리에있는 경우을 호출하기 전에 실제로 항목을 삭제하거나 컬렉션에 추가했는지 확인하십시오 notifyDataSetChanged().

데이터베이스 또는 서비스 백엔드로 작업하는 경우을 호출하기 전에 메소드를 호출하여 정보를 다시 검색하거나 메모리 데이터를 조작해야합니다 notifyDataSetChanged().

문제는 notifyDataSetChanged데이터 세트가 변경된 경우에만 작동합니다. 따라서 변경 사항이없는 경우 살펴볼 곳입니다. 필요한 경우 디버그하십시오.

ArrayAdapter와 BaseAdapter

BaseAdapter와 같이 컬렉션을 관리 할 수있는 어댑터를 사용하면 더 잘 작동한다는 것을 알았습니다. ArrayAdapter와 같은 일부 어댑터는 이미 자체 컬렉션을 관리하므로 업데이트를위한 적절한 컬렉션에 도달하기가 더 어렵습니다. 그것은 실제로 대부분의 경우 불필요하게 여분의 어려움 층입니다.

UI 스레드

UI 스레드에서 호출해야합니다. 다른 답변에는이를 달성하는 방법에 대한 예가 있습니다. 그러나이 정보는 UI 스레드 외부에서 작업하는 경우에만 필요합니다. 그것은 서비스 또는 비 UI 스레드에서 온 것입니다. 간단한 경우에는 버튼 클릭이나 다른 활동 / 조각으로 데이터를 업데이트합니다. 여전히 UI 스레드 내에 있습니다. 항상 runOnUiTrhead를 팝업 할 필요가 없습니다.

빠른 예제 프로젝트

https://github.com/hanscappelle/so-2250770.git 에서 찾을 수 있습니다 . Android Studio (gradle)에서 프로젝트를 복제하고 엽니 다. 이 프로젝트에는 ListView모든 임의의 데이터 가 포함 된 MainAcitivity 빌딩이 있습니다. 이 메뉴는 작업 메뉴를 사용하여 새로 고칠 수 있습니다.

이 예제 ModelObject에 대해 작성한 어댑터 구현은 데이터 콜렉션을 노출합니다.

public class MyListAdapter extends BaseAdapter {

    /**
     * this is our own collection of data, can be anything we 
     * want it to be as long as we get the abstract methods 
     * implemented using this data and work on this data 
     * (see getter) you should be fine
     */
    private List<ModelObject> mData;

    /**
     * our ctor for this adapter, we'll accept all the things 
     * we need here
     *
     * @param mData
     */
    public MyListAdapter(final Context context, final List<ModelObject> mData) {
        this.mData = mData;
        this.mContext = context;
    }

    public List<ModelObject> getData() {
        return mData;
    }

    // implement all abstract methods here
}

MainActivity의 코드

public class MainActivity extends Activity {

    private MyListAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView list = (ListView) findViewById(R.id.list);

        // create some dummy data here
        List<ModelObject> objects = getRandomData();
        // and put it into an adapter for the list
        mAdapter = new MyListAdapter(this, objects);
        list.setAdapter(mAdapter);

        // mAdapter is available in the helper methods below and the 
        // data will be updated based on action menu interactions

        // you could also keep the reference to the android ListView 
        // object instead and use the {@link ListView#getAdapter()} 
        // method instead. However you would have to cast that adapter 
        // to your own instance every time
    }

    /**
     * helper to show what happens when all data is new
     */
    private void reloadAllData(){
        // get new modified random data
        List<ModelObject> objects = getRandomData();
        // update data in our adapter
        mAdapter.getData().clear();
        mAdapter.getData().addAll(objects);
        // fire the event
        mAdapter.notifyDataSetChanged();
    }

    /**
     * helper to show how only changing properties of data 
     * elements also works
     */
    private void scrambleChecked(){
        Random random = new Random();
        // update data in our adapter, iterate all objects and 
        // resetting the checked option
        for( ModelObject mo : mAdapter.getData()) {
            mo.setChecked(random.nextBoolean());
        }
        // fire the event
        mAdapter.notifyDataSetChanged();
    }
}

추가 정보

listViews의 힘에 대한 또 다른 멋진 게시물은 여기에서 찾을 수 있습니다 : http://www.vogella.com/articles/AndroidListView/article.html


답변

원할 때마다 실행 가능 전화 :

runOnUiThread(run);

OnCreate()실행 가능한 스레드를 설정합니다.

run = new Runnable() {
    public void run() {
        //reload content
        arraylist.clear();
        arraylist.addAll(db.readAll());
        adapter.notifyDataSetChanged();
        listview.invalidateViews();
        listview.refreshDrawableState();
    }
};


답변

내 목록보기의 동적 새로 고침에 문제가 있습니다.

어댑터에서 notifyDataSetChanged ()를 호출하십시오.

notifyDataSetChanged ()를 호출하는 방법 / 언제에 대한 일부 추가 정보는이 Google I / O 비디오에서 볼 수 있습니다.

내 경우에는 notifyDataSetChanged ()가 제대로 작동하지 않았습니다 [다른 클래스에서 notifyDataSetChanged를 호출했습니다]. 이 경우 실행중인 활동 (스레드)에서 ListView를 편집했습니다. Christopher 덕분에 그 비디오 는 마지막 힌트를 주었다.

내 두 번째 수업에서 나는

Runnable run = new Runnable(){
     public void run(){
         contactsActivity.update();
     }
};
contactsActivity.runOnUiThread(run);

내 활동에서 update ()에 액세스합니다. 이 업데이트에는 다음이 포함됩니다

myAdapter.notifyDataSetChanged();

보기를 새로 고치도록 어댑터에 지시하십시오. 내가 말할 수있는 한 잘 작동했습니다.


답변

SimpleCursorAdapter 를 사용 하는 경우 Cursor 객체에서 requery () 를 호출 하십시오.


답변

여전히 ListView Refreshment에 만족하지 않으면이 스 니펫을 볼 수 있습니다.이 코드는 DB에서 listView를로드하기위한 것입니다. 실제로 CRUD 작업을 수행 한 후 ListView를 다시로드하는 것이 가장 좋습니다. 코드,하지만 원하는대로 ListView를 새로 고칩니다 ..

그것은 나를 위해 작동합니다 …. 더 나은 솔루션을 찾으면 공유하십시오 …

.......
......
CRUD 작업을 수행하십시오 ..
......
.....
DBAdapter.open ();
DBAdapter.insert_into_SingleList ();
// DB_results를 가져 와서 내용으로 나열합니다.
                                            ls2.setAdapter (새로운 ArrayAdapter (DynTABSample.this,
    android.R.layout.simple_list_item_1, DBAdapter.DB_ListView));
                                            DBAdapter.close ();