2013-01-29 26 views
14

Tôi đang viết một ứng dụng Android đọc một tệp văn bản và hiển thị nó trên TextView.Android - Làm thế nào để bạn tải một cách hiệu quả một lượng lớn văn bản trong một TextView?

Những gì tôi đang làm bây giờ là đọc toàn bộ tệp thành một chuỗi (sử dụng BufferedReaderStringBuilder) và hiển thị nó trên TextView sử dụng setText(string). Một tập tin văn bản 700KB có thể mất khoảng 2 đến 3 giây trước khi nó được hiển thị trên màn hình.

Nhưng tôi đã sử dụng một số trình đọc sách điện tử khác trên thị trường và chúng có thể hiển thị cùng một văn bản gần như ngay lập tức. Bất cứ ai biết làm thế nào tôi có thể đạt được điều này?

Cảm ơn bạn.

Chỉnh sửa: Nhiều đề xuất ListView, nhưng nó không hoạt động đối với trường hợp cụ thể của tôi. Đây là câu trả lời của tôi cho một trong những câu trả lời: ... [ListView] không hoạt động cho tôi vì một vài lý do. (1) Để làm cho Listview trông giống như một TextView, chúng ta phải phá vỡ văn bản trên ký tự dòng mới. Nếu tôi tải một đoạn văn lớn, nó chỉ chậm như tải một TextView. (2) Vì ListView chỉ đo lường mục trên màn hình, tôi không thể biết trước tổng số 'trang' hoặc 'chiều cao' của toàn bộ văn bản.

Trả lời

6

Về cơ bản, điều quan trọng là chỉ tải dữ liệu bạn cần, khi bạn cần. Một cách để làm điều này là đặt mọi đoạn văn vào TextView của chính nó, được đưa vào một ListAdapter, được đưa vào một ListView. Phải có một số loại chỉ mục được đặt tại chỗ, sao cho mỗi đoạn đều biết vị trí trong tệp dữ liệu cần tìm. Giao diện này sẽ cho phép bạn tải chỉ những gì bạn cần, khi bạn cần nó. bộ chuyển đổi danh sách của bạn trông giống như thế này (Mã này là chưa hoàn chỉnh, nhưng nó sẽ cho bạn một ý tưởng ít nhất những gì bạn nên làm):

class ParagraphAdapter extends ListAdapter{ 
ArrayList<Integer> mLocations; // Somewhere define this to your locations, I'll leave that for you to figure out 
protected View getView(int position,View convertView, ViewGroup parent) 
{ 
    mLocations.get(position); // Read the file starting at this position, until the next value 
    String text; // This is the output of the above 
    TextView tv=new TextView(context); 
    tv.setText(parent.getContext()); 
} 
} 

Nó có thể được lưu ý rằng Amazon sử dụng một hệ thống phân trang cho Ứng dụng Kindle. Nếu bạn có ứng dụng, bạn có thể thấy ở cuối mỗi trang bạn đang ở phần nào. Mỗi "trang" có lẽ gần gũi hơn với một câu hoặc lâu hơn. Sau đó, nó chỉ là vấn đề nhận được đúng trang, mà có thể khá nhanh chóng được thực hiện.

+0

Cuối cùng tôi đã có thời gian để giải quyết vấn đề và giải pháp này không hiệu quả đối với tôi vì một vài lý do. (1) Để làm cho Listview trông giống như một TextView, chúng ta phải phá vỡ văn bản trên ký tự dòng mới. Nếu tôi tải một đoạn văn lớn, nó chỉ chậm như tải một TextView. (2) Vì ListView chỉ đo lường mục trên màn hình, tôi không thể biết trước tổng số 'trang' hoặc 'chiều cao' của toàn bộ văn bản. –

2

Để thêm vào những gì @PearsonArtPhoto đã nói -

tôi đề nghị bạn thực hiện một số loại cơ chế phân trang, chia văn bản của bạn vào các trang.
Việc bạn nên làm là chia nhỏ văn bản của mình theo giả sử số ký tự N + M trên mỗi trang.
N = số ký tự cố định.
M = số ký tự từ N đến ký tự cuối dòng gần nhất (vì vậy bạn sẽ không thấy dòng cuối cùng bị "cắt").
Tôi sẽ đề nghị rằng nếu thiết bị Android của bạn cho phép bạn giữ điều này "trong bộ nhớ" -
làm điều đó,
và không cố gắng tìm nạp từ tệp này sang trang khác, mà là tìm nạp từ "trong bộ nhớ "cấu trúc - điều này sẽ cải thiện hiệu suất.
Khi bạn cuộn và nhận ra bạn cần tìm nạp trang tiếp theo, hãy tìm nạp nó từ cấu trúc "trong bộ nhớ".

0

Bạn phải cân nhắc xem bạn có đang sử dụng các thành phần phù hợp hay không. Có thể nó là tốt hơn để đọc dòng và đặt chúng vào listview.

thử

List<String> lines; 
listview.adapter(new ArrayAdapter<String>(...,lines)); 

Và nhiều lần so với những gì bạn thấy (xem và cảm nhận) không giống như bạn nghĩ.

1

Lucas Rocha đã xây dựng một thư viện đẹp gọi là Smoothie cho mục đích đó.

http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

Vào cuối những mẹo hiệu suất dành cho Android listview có một liên kết đến một lời giải thích về Smoothie và cuối cùng bạn sẽ tìm thấy thư viện có sẵn trên github.

Được mô tả ban đầu để tải hình ảnh, phương pháp cũng áp dụng cho việc tải văn bản.

+0

Chào mừng bạn đến với SO! Cân nhắc cải thiện chất lượng câu trả lời của bạn và giúp nó tự đứng vững (tức là nếu liên kết không còn hoạt động) bằng cách trình bày cách áp dụng thư viện mà bạn đã cung cấp liên kết đến vấn đề trong tầm tay. – J0e3gan