簡體   English   中英

從SD卡讀取的文本,未在ListView中顯示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM