ListView 位置关闭后不保存

Posted

技术标签:

【中文标题】ListView 位置关闭后不保存【英文标题】:ListView position doesn't save after close 【发布时间】:2016-09-02 03:35:50 【问题描述】:

我设法更改了我的ListView 的项目位置,但在我关闭我的应用程序后,该位置又回到了我进行任何更改之前的位置。

什么以及如何保存项目的排列位置?

填充ListView

String[] SavedFiles;
String dataDr;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_address);

    dataDr = getApplicationInfo().dataDir;
    showDirFile(dataDr);


void showDirFile(String dirpth)

    String path = dirpth+"/files";
    Log.d("Files", "Path: " + path);
    File f = new File(path);
    File file[] = f.listFiles();
    Log.d("Files", "Size: "+ file.length);

    SavedFiles = new String[file.length];
    for (int i=0; i < file.length; i++)
    
        Log.d("Files", "FileName:" + file[i].getName());

        SavedFiles[i] = file[i].getName();
    

    ArrayAdapter<String> adapter
            = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1,
            SavedFiles);
    listView.setAdapter(adapter);

更改项目位置并将其保存到Array

Collections collections;

void positionChange()

    //to store arrays into ArrayList
    List<String> newList = new ArrayList<String>(Arrays.asList(myDataFiles));

    //to get the item's position @ get the first item in array if multiple arrays exist
    String currentPos = String.valueOf(intArrayList.get(0));
    int oldPos = Integer.valueOf(currentPos);
    int newPos = oldPos-1;

    //Swap position @ move up list
    collections.swap(newList, oldPos, newPos);

    //store ArrayList data into arrays
    myDataFiles = newList.toArray(myDataFiles);

    intArrayList.clear();

    adapter.notifyDataSetChanged();

编辑

请注意Array 中的项目是从dataDr = getApplicationInfo().dataDir; 填写的

也许我需要想办法将排列位置保存在我的目录中?

【问题讨论】:

您的物品何时再次改变位置?当您最小化应用程序并再次恢复或完全关闭应用程序时? @AwaisAhmad 当我完全关闭我的应用程序时。现在我注意到,当我打开一个新活动或按下设备的返回按钮时,它也会恢复到原始状态 只需将位置保留在共享首选项中并在启动应用程序时设置它 @Rithe 好吧,我研究了一些关于 sharedpreference 的知识,它似乎可以完成这项工作。但在我实现这个之前,这将如何检索我的项目的位置,因为我使用dataDr = getApplicationInfo().dataDir; 填充了我的Array。请作为答案发布,因为我不确定如何实现这一点 【参考方案1】:

正如我在 cmets 中已经提到的,SharedPreferences 可以解决问题。在你的 onCreate 方法中初始化它。

// use member variable for this (private SharedPreferences prefs)
prefs = this.getSharedPreferences("com.example.app", Context.MODE_PRIVATE);

由于您的项目的位置可能会发生变化,因此最好存储文件名而不是位置。这样做的好地方可能是onItemSelected(因此你必须在你的列表视图中添加一个监听器)。

listView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
  @Override
  public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
    prefs.edit().putString("yourKey", listView.getItemAtPosition(position)).apply();
  
);

要在启动应用程序后设置正确的位置,您必须在 SavedFile 对象中获取文件的位置。

SharedPreferences加载字符串:

String fileName = prefs.getString("yourKey", ""); 

在您的列表视图和适配器初始化之后,只需遍历列表并比较字符串。如果字符串匹配,则获取该位置并将其设置为您的列表视图对象。

for(int i = 0; i < SavedFiles.length; i++)
  if(fileName.equals(SavedFiles[i]))
    listview.setSelection(i);
    break;
  

【讨论】:

以上是关于ListView 位置关闭后不保存的主要内容,如果未能解决你的问题,请参考以下文章

返回 ListView 时保持/保存/恢复滚动位置

返回ListView时保持/保存/恢复滚动位置

java [Android]返回ListView时保存滚动位置

java [Android]返回ListView 2时保存滚动位置

如何在应用重新启动之间保存和恢复 Flutter ListView 的滚动位置?

listview点击跳转显示信息