ArrayList Adapter(用于ListView)仅显示第一个添加的项目

时间:2016-08-20 03:19:44

标签: java android listview arraylist

编辑3:我自己的项目列表布局:

<?xml version="1.0" encoding="utf-8"?>

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@android:id/text1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:textAppearance="?android:attr/textAppearanceListItemSmall"
      android:gravity="center_vertical"
/>

Edit2:老实说,我可能只是创建一个为每个文件创建按钮的for循环。这是值得花时间的头痛。

编辑:我想强调一下这样一个事实:我已将我的确切代码复制+粘贴到新的测试应用中,并且工作正常。这可能会给你们一个线索。

经过大量的调试,我已经缩小了问题范围。我试图将项目(文件)添加到ArrayList,然后将其放入ArrayAdapter,最后在ListView中显示项目。问题是只显示第一个添加的项目。

以下是我试图做的事情:

ListView listView = (ListView) view.findViewById(R.id.templateFilesList);

    ArrayList<String> templateList = new ArrayList<>();



    File myDir = getContext().getFilesDir();
    File[] templateFiles = myDir.listFiles();

    int length = templateFiles.length;

    for(int i = 0; i < length; i++){
        templateList.add(templateFiles[i].getName());
    }

    ArrayAdapter arrayAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1,
            templateList);

    listView.setAdapter(arrayAdapter);

templateFiles []数组正确获取内部存储中的8个文件(通过logcat / debugger确认),但只有第一个项目显示在ListView中。这里有一个更清晰的问题:

// If I replace the for loop with this:

    templateList.add(templateFiles[1].getName());
    templateList.add(templateFiles[0].getName());

仅显示templateFiles [1]。同样,如果我这样做:

    templateList.add(templateFiles[0].getName());
    templateList.add(templateFiles[1].getName());

仅显示templateFiles [0]。关于出了什么问题的任何想法?

这是我的XML:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.template_housing.MyTemplatesFrag"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    >

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/my_templates"
        android:textSize="34sp"
        android:textColor="@color/black"
        android:background="@color/Gold1"
        android:gravity="center_horizontal"
        android:padding="5dp"
        android:layout_marginBottom="10dp"
/>

<ListView
        android:id="@+id/templateFilesList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
>

</ListView>

5 个答案:

答案 0 :(得分:1)

如果您要更新适配器的内容,您应该调用notifyDataSetChanged()以确保您的适配器知道您的内容确实发生了变化

答案 1 :(得分:1)

我复制了您的代码并在Android Studio中运行了它。这似乎没问题。

这是我的活动代码(相同的xml代码),唯一的区别是我使用的是Activity,你可以使用Fragment。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ListView listView = (ListView) findViewById(R.id.templateFilesList);
    ArrayList<String> templateList = new ArrayList<>();

    File myDir = getFilesDir();
    File[] templateFiles = myDir.listFiles();
    int length = templateFiles.length;

    //case 1: in my project, length is 1, show only one element, see case2.
//        for (int i = 0; i < length; i++) {
//            templateList.add(templateFiles[i].getName());
//        }

    //case 2: try to add simple strings, 
    //because you said put simple strings in the list could cause the problem, too.
    templateList.add("a1");
    templateList.add("a2");
    templateList.add("a3");

    ArrayAdapter arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,
            templateList);
    listView.setAdapter(arrayAdapter);
}
}

enter image description here

我在GitHub上分享了我的代码。我强烈建议您在Github上发布完整代码,让我们检查您的代码。

答案 2 :(得分:0)

尝试将其转换为字符串数组:

String [] templateListArray = templateList.toArray(new String[templateList.size()]);

然后按如下方式进行分配:

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_list_item_1,
            templateListArray);

希望这会解决它。

答案 3 :(得分:0)

您是否也可以发布简单列表项1 XML文件。这个问题与Java代码无关,它与XML和元素大小有关。尝试删除列表视图顶部的文本视图,并且您的简单列表项视图应具有wrap content作为布局高度。

如果您仍想使用textview,可以使用权重属性。为textview提供权重0,列表视图权重为1.

答案 4 :(得分:0)

您的阵列适配器可能未正确设置,因此无法正常工作,因此请尝试通过以下代码替换您的阵列适配器,并检查它是否正常工作,

   ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
          android.R.layout.simple_list_item_1, android.R.id.text1, templateList);