我觉得我非常接近解决方案...我没有收到任何错误或崩溃,但我的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 ...而不是标题和引用或诗,在这里。
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}}
答案 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;
}