notifyDataSetChanged () не обновляет ListView после уведомления адаптера - PullRequest
3 голосов
/ 06 февраля 2012

Я пытаюсь сделать файловый менеджер в Android, и для этого у меня есть макет со списком (код ниже).

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="500dp"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:id="@+id/tvfileExplorer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/fileExplorer"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" 
        android:layout_gravity="center_horizontal">
        <Button
            android:id="@+id/bRoot"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margins"
            android:layout_weight=".33"
            android:text="@string/root" />
        <Button
            android:id="@+id/bOk"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margins"
            android:text="@string/ok" 
            android:layout_weight=".33"/>
        <Button
            android:id="@+id/bCancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margins"
            android:text="@string/cancel"
            android:layout_weight=".33" />
    </LinearLayout>    
    <ListView
        android:id="@+id/lvFileList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/margins" 
        android:choiceMode="multipleChoice">
    </ListView>
</LinearLayout>

После добавления всех файлов и папок в список я делаю notifyDataSetChanged () для адаптера списка. Но список не обновляется. Вы можете увидеть ниже код деятельности.

public class FileExplorer extends Activity{ 
    private File currentDirectory = new File("/");
    private List<String> directoryEntries = new ArrayList<String>();
    private ArrayAdapter<String> lvFileExplorerListAdapter;
    private Activity mActivity;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.file_explorer);        
        mActivity = this;

        lvFileExplorerListAdapter = new ArrayAdapter<String>(mActivity, android.R.layout.simple_list_item_multiple_choice, directoryEntries);

        ListView lvFileExplorerList = (ListView)findViewById(R.id.lvFileList);

        lvFileExplorerList.setAdapter(lvFileExplorerListAdapter);        

        Button bCancel = (Button)findViewById(R.id.bCancel);
        bCancel.setOnClickListener(new OnClickListener() {          
        @Override
        public void onClick(View v) {       
            finish();
        }
    });

        Button bRoot = (Button)findViewById(R.id.bRoot);
        bRoot.setOnClickListener(new OnClickListener() {            
        @Override
        public void onClick(View v) {
            browseToRoot();
        }
    });

        browseToRoot();
    }

    private void browseToRoot() {
        browseTo(new File("/"));    
    }       

    private void browseTo(final File aDirectory){
    if (aDirectory.isDirectory()){
            this.currentDirectory = aDirectory;
            fill(aDirectory.listFiles());
        }
    }

    private void fill(File[] files) {
    directoryEntries.clear();

    if(this.currentDirectory.getParent() != null)
        directoryEntries.add(getString(R.string.upOneLevel));

    int currentPathStringLenght = this.currentDirectory.getAbsolutePath().length();
    for (File file : files){                     
            directoryEntries.add(file.getAbsolutePath().substring(currentPathStringLenght));
    } 

    lvFileExplorerListAdapter.notifyDataSetChanged();
    }
}

Важно сказать, что в списке есть значения, которые она должна иметь.

Есть предложения? Спасибо

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Я разобрался с моей проблемой ...

На макете у меня есть линейное расположение, которое содержит кнопки.Как вы можете видеть выше, у меня есть * match_parent *, который можно рисовать над списком.Я изменил его на wrap_content и все в порядке.

Спасибо за помощь, ребята!

0 голосов
/ 06 февраля 2012

Вы пытались сделать вид недействительным после notifyDatasetChanged?

lvFileExplorerList.invalidate();
0 голосов
/ 06 февраля 2012

Проблема здесь:

directoryEntries.add(file.getAbsolutePath().substring(currentPathStringLenght));

вы добавляете элементы в directoryEntries, пока адаптер хранит свою собственную копию данных. Попробуйте заменить эту строку на:

lvFileExplorerListAdapter.add(file.getAbsolutePath().substring(currentPathStringLenght)) ; 

Всякий раз, когда вам нужно изменить элементы списка, вы должны работать непосредственно с адаптером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...