0

ListActivity クラスがあります。属性の 1 つに従って項目を並べ替えるボタンがあります。ただし、アイテムが名前で並べ替えられているにもかかわらず、元の位置のアイテムをクリックすると実行されることがあります。コード スニペットは次のとおりです。

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playlist);

        mButton = (ToggleButton) findViewById(R.id.mButton);

        ArrayList<myObject> ListData = new ArrayList<myObject>();

        back = (ImageButton) findViewById(R.id.backButton);
        label = (TextView) findViewById(R.id.likethis);
        label.setText("List");
        inputSearch = (EditText) findViewById(R.id.inputSearch);

        //Manager -- class that reads from the sdcard
        Manager plm = new Manager();

        // get all files from sdcard
        //getList() function of Manager class
        //List declared outside oncreate()
        this.List = plm.getList(); 

        final ArrayList<myObject> backUp = new ArrayList<myObject>(songsList);

        if(sortCalled) {
            mButton.setBackgroundDrawable(getResources().getDrawable(R.drawable.m_checked));
            mButton.setChecked(true);
            Collections.sort(List);

            notifyDataChanged(List);
        }
        else {
            mButton.setBackground(getResources().getDrawable(R.drawable.m_unchecked));
            mButton.setChecked(false);
            notifyDataChanged(backUp);
        }

        back.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                finish();
            }

        });

        inputSearch.addTextChangedListener(new TextWatcher(){

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
                adapter.notifyDataSetChanged();
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub

            }

            @Override 
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                // TODO Auto-generated method stub
                //ArrayList <Song> temp;
                ((SimpleAdapter) PlayListActivity.this.adapter).getFilter().filter(s, new Filter.FilterListener() {

                    public void onFilterComplete(int count) {
                        // TODO Auto-generated method stub
                        adapter.notifyDataSetChanged();
                    }
                });
                adapter.notifyDataSetChanged();


            }

        });

        mButton.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(mButton.isChecked()){
                    mButton.setBackgroundDrawable(getResources().getDrawable(R.drawable.m_checked));
                    Collections.sort(List);
                    sortCalled = true;
                    notifyDataChanged(List);
                }
                else{
                    sortCalled = false;
                    mButton.setBackgroundDrawable(getResources().getDrawable(R.drawable.m_unchecked));
                    notifyDataChanged(backUp);
                }
            }

        });
    }

    public void settingListAdapter(SimpleAdapter adapter){
        setListAdapter(adapter);
        ListView lv = getListView();
        // listening to single listitem click
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // getting listitem index
                int Index = position;

                // Starting new intent
                Intent in = new Intent(getApplicationContext(),
                        MainActivity.class);
                // Sending Index to MainActivity
                in.putExtra("Index", Index);
                setResult(100, in);
                // Closing ListView
                finish();
            }
        });
    }

    public void notifyDataChanged(ArrayList<Song> songsList) {
        // TODO Auto-generated method stub
        setListAdapter(null);
        sortCalled = true;
        ArrayList<myObject> songsListData = new ArrayList<myObject>();

        for (int i = 0; i < songsList.size(); i++) {
            // creating new HashMap
            myObject ob = sList.get(i);

            // adding HashList to ArrayList
            ListData.add(ob);
        }

        ArrayList<HashMap<String, String>> array = new ArrayList<HashMap<String,String>>();
       // int j = 0;
        for(myObject i : ListData){
            HashMap<String, String> feed = new HashMap<String, String>();
            feed.put("Title", i.getTitle());
            array.add(feed);

        }
        BaseAdapter adapter1;
       // int i = 0;
        // Adding menuItems to ListView
         adapter1 = new SimpleAdapter(this, array,
                R.layout.list_item, new String[]{"Title" }, new int[] {
                        R.id.Title });

        setListAdapter(adapter1);
        adapter1.notifyDataSetChanged();

        ListView lv = getListView();
        // listening to single listitem click

        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // getting listitem index
                int Index = position;

                // Starting new intent
                Intent in = new Intent(getApplicationContext(),
                        MainActivity.class);
                // Sending songIndex to MainActivity
                in.putExtra("Index", Index);
                setResult(100, in);
                // Closing ListView
                finish();
            }
        });
4

3 に答える 3

2

これを試してみるべきだと思います。リストビューのデータを並べ替えるときは、完璧に機能しています

 adapter.notifyDataSetChanged();
于 2012-10-23T04:38:45.363 に答える
1

アダプターに変更を加えるたびに、UIThread で notifyDataSetChanged() を呼び出す必要があります

このビデオをチェックして、listView をよりよく理解してください

編集
ArrayAdapter の場合、notifyDataSetChanged はadd, insert, remove, and clear、アダプターで関数を使用する場合にのみ機能します。

ArrayAdapter が構築されると、渡されたリストの参照が保持されます。Activity のメンバーである List を渡し、後でその Activity メンバーを変更する場合、ArrayAdapter は引き続きへの参照を保持します。元のリスト。アダプタは、アクティビティでリストが変更されたことを知りません。

選択肢は次のとおりです。

ArrayAdapter の関数を使用して、基になる List を変更し(add, insert, remove, clear, etc.) ます。新しい List データで ArrayAdapter を再作成します。(多くのリソースとガベージ コレクションを使用します。) BaseAdapter および ListAdapter から派生した独自のクラスを作成して、基になる List データ構造を変更できるようにします。リストが更新されるたびに、notifyDataSetChanged を使用します。UI スレッドで呼び出すには、アクティビティの runOnUiThread メソッドを使用します。その後、notifyDataSetChanged が機能します。

于 2012-10-29T15:39:49.777 に答える
0

Adapter.notifyDataSetChanged() 関数を試すことができます。それはうまくいくかもしれません。

SimpleCursorAdapter を使用している場合、アダプタにアタッチされたカーソルで requery() を呼び出すと、アダプタとアタッチされたビューが自動的に更新されます。

BaseAdapter のコンテンツが変更された場合は、BaseAdapter.notifyDataSetChanged() を呼び出して、ListView に自身を更新するように指示します。

つまり、次の小さな変更を加えるだけで済みます。

public void setValue(Object newValue) {
     this.value = newValue;
     notifyDataSetChanged();
}

実際には、既存のアイテムの状態を (新しいものを追加するなどではなく) 変更しているので、notifyDataSetInvalidated() の方が適しています。

于 2012-10-23T05:29:21.967 に答える