从SD卡读取的文本,未在ListView中显示

时间:2015-03-16 03:57:18

标签: android listview android-arrayadapter android-file

我觉得我非常接近解决方案...我没有收到任何错误或崩溃,但我的SD卡中的文本文件根本没有显示。

意图:我正在尝试从SD卡上的Documents目录中的特定目录中读取所有文件,然后在读取每个文件后,应通过我的适配器将其加载到ListView。我有一个模型设置(PoemListItem.java),它应该在Strings中检索文件的标题和文件的内容。我知道它到达了目录中的文件,因为当我带走for loop时,ArrayList<>将默认文本(如果目录中的文件不多)添加到package org.azurespot.cutecollection; import android.os.Bundle; import android.os.Environment; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import org.azurespot.R; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; /** * Created by mizu on 2/8/15. */ public class TextTab extends Fragment { private ArrayList<PoemListItem> poems = new ArrayList<>(); private ListViewPoemAdapter adapter; private ListView listView; String[] allSDCardFiles = null; StringBuilder text; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View v = inflater.inflate(R.layout.text_tab, container, false); adapter = new ListViewPoemAdapter(getActivity(), poems); // Attach the adapter to a ListView listView = (ListView) v.findViewById(R.id.text_list_view); listView.setAdapter(adapter); // read contents of SD card loadSDCard(); // add the default icon/lines remaining to ArrayList, if less than 24 files on SD card for (int i = 0; i < (24 - allSDCardFiles.length); i++) { PoemListItem sampleItem = new PoemListItem(" ", " "); adapter.add(sampleItem); i++; } setupListViewListener(); return v; } private void loadSDCard(){ // gets directory CuteWords rom sd card File baseDir = Environment.getExternalStorageDirectory(); File cuteWordsDir = new File(baseDir, "/Documents/CuteWords"); // lists all files in CuteWords, loads in Files[] array File[] files = cuteWordsDir.listFiles(); for (File singleFile : files) { //Read text from file, put each line into StringBuilder text = new StringBuilder(); try { BufferedReader br = new BufferedReader(new FileReader(singleFile)); String line; while ((line = br.readLine()) != null) { text.append(line); text.append('\n'); // add file name and text in file to adapter, to display in ListView PoemListItem wordsFromFile = new PoemListItem(singleFile.getName(), text.toString()); adapter.add(wordsFromFile); } } catch (IOException e) { e.printStackTrace(); } } // get number of files in CuteWords directory allSDCardFiles = new String[files.length]; } // so you can edit any of the list items private void setupListViewListener() { listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapter, View item, int pos, long id){ // code to edit then save typed text } }); listView.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> aView, View item, int pos, long id) { poems.remove(pos); adapter.notifyDataSetChanged(); // writeItems(); return true; } }); } } 中,那么列表中的行与目录中的文件数完全相同。所以那部分起码至少。唯一的问题是没有任何表现。为什么呢?

感谢您的帮助!

在这里你可以看到一个列表项显示(因为在选择的SD卡目录中有一个文件),但是标题和文本是来自xml的提示代码,而不是实际的文件标题和内容。我假设在导入文件内容时会覆盖提示文本?它似乎并不在这里...实际的标题和文本应该是简单的:文件名和测试2 ...而不是标题和引用或诗,在这里。

enter image description here

TextTab.java

package org.azurespot.cutecollection;

/**
 * Created by mizu on 3/12/15.
 */
public class PoemListItem {

    private String title;
    private String poem;

    public PoemListItem(){}

    public PoemListItem(String t, String p){
        this.title = t;
        this.poem = p;
    }

    public String getTitle(){
        return title;
    }

    public void setTitle(String title){
        this.title = title;
    }

    public String getPoem(){
        return poem;
    }

    public void setPoem(String poem){
        this.poem = poem;
    }

}

这是我的模特: 的 PoemListItem.java

package org.azurespot.cutecollection;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;

import org.azurespot.R;

import java.util.ArrayList;

/**
 * Created by mizu on 2/8/15.
 */
public class ListViewPoemAdapter extends ArrayAdapter<PoemListItem> {

    private Context context;
    private EditText poemText;
    private EditText poemTitle;
    private ImageView poemPlaceholder;


    public ListViewPoemAdapter(Context context, ArrayList<PoemListItem> poems) {
        super(context, 0, poems);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        PoemListItem poemListItem = getItem(position);

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext())
                    .inflate(R.layout.text_listview_row, parent, false);
        }

        poemTitle = (EditText) convertView.findViewById(R.id.et_text_title);
        poemText = (EditText) convertView.findViewById(R.id.et_text);
        poemPlaceholder = (ImageView)convertView.findViewById(R.id.icon_placeholder_poem);

        poemPlaceholder.setBackgroundResource(R.drawable.ic_poem_placeholder);
        poemPlaceholder.setScaleType(ImageView.ScaleType.CENTER_CROP);
        poemPlaceholder.setLayoutParams(new LinearLayout.LayoutParams(150, 150));



//        poemTitle.setText(poemListItem.getTitle());
//        poemText.setText(poemListItem.getPoem());

        return convertView;

    }
}

您可能不需要查看适配器,但以防万一:

ListViewPoemAdapter.java

{{1}}

2 个答案:

答案 0 :(得分:0)

你的arraylist是空的。 在arraylist中添加“wordsFromFile”而不是适配器。

答案 1 :(得分:0)

发现错误!我的适配器代码引用了我的模型(以连接我的视图)并不完整。当您创建要用于自定义ListView的模型(列表行具有单独的xml文件)时,您必须在模型中包含列表项中的内容。就我而言,我有两个EditText项代表标题和诗文本身。所以我的模型缺少这些内容:

PoemListItem poemListItem = getItem(position);

poemTitle.setText(poemListItem.getTitle());
poemText.setText(poemListItem.getPoem());

下面,您可以在上下文中看到它们。一旦我取消注释它们,我发现我的列表中填充了SD卡文件中的标题和文本正文。我让他们注释掉的唯一原因是,我的xml EditText中的提示文字会显示出来。现在,提示文本没有显示在列表的占位符行上,但这是我可以接受的妥协。所以我的大部分代码都是正确的,我的适配器中只有一些缺少的行。

<强> ListViewPoemAdapter.java

package org.azurespot.cutecollection;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;

import org.azurespot.R;

import java.util.ArrayList;

/**
 * Created by mizu on 2/8/15.
 */
public class ListViewPoemAdapter extends ArrayAdapter<PoemListItem> {

    private Context context;
    private EditText poemText;
    private EditText poemTitle;
    private ImageView poemPlaceholder;


    public ListViewPoemAdapter(Context context, ArrayList<PoemListItem> poems) {
        super(context, 0, poems);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        PoemListItem poemListItem = getItem(position);

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext())
                    .inflate(R.layout.text_listview_row, parent, false);
        }

        poemTitle = (EditText) convertView.findViewById(R.id.et_text_title);
        poemText = (EditText) convertView.findViewById(R.id.et_text);
        poemPlaceholder = (ImageView)convertView.findViewById(R.id.icon_placeholder_poem);

        poemPlaceholder.setBackgroundResource(R.drawable.ic_poem_placeholder);
        poemPlaceholder.setScaleType(ImageView.ScaleType.CENTER_CROP);
        poemPlaceholder.setLayoutParams(new LinearLayout.LayoutParams(150, 150));

        poemTitle.setText(poemListItem.getTitle());
        poemText.setText(poemListItem.getPoem());

        return convertView;
    }