[英]Text read from SD Card, not showing in ListView
我覺得我已經很接近解決方案了……我沒有收到任何錯誤或崩潰的消息,但是我的SD卡中的文本文件根本沒有顯示。
目的:我試圖從SD卡上“文檔”目錄中的特定目錄中讀取所有文件,然后一旦讀取了每個文件,就應通過適配器將其加載到我的ListView
。 我有一個模型設置( PoemListItem.java
),該模型應該在Strings
檢索文件的標題和文件的內容。 我知道它到達目錄中的文件,因為當我for loop
將默認文本(如果目錄中沒有很多文件)添加到ArrayList<>
的for loop
,則列表中的行數為完全等於目錄中的文件數。 因此,該部分至少有效。 唯一的問題是沒有任何顯示。 為什么?
謝謝你的幫助!
在這里您可以看到顯示了一個列表項(因為選擇的SD卡目錄中有一個文件),但是標題和文本是xml中的提示代碼,而不是實際的文件標題和內容。 我假設當您導入文件內容時提示文本被覆蓋了嗎? 似乎不在這里...應該在此處的實際標題和文本只是:文件名和Test 2 ...在這里,而不是Title和Quote或poem。
TextTab.java
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;
}
});
}
}
這是我的模型: PoemListItem.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;
}
}
您可能不需要看適配器,但以防萬一:
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;
}
}
您的數組列表為空。 在arraylist中添加“ wordsFromFile”而不是適配器。
發現錯誤! 引用我的模型(以連接視圖)的適配器代碼未完成。 當您創建用於自定義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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.