前提
AndroidStudio(言語はJava)で青空文庫の専用ブラウザのようなものを作ろうとしています。
画面の動きとしては
①あ行~わ行のRcyclerView(「○行の作品をさがす」というメッセージ)
②行の選択後、作品名の頭文字を選択する(たとえば、た行を選んだのであれば「『た』から始まる作品を探す」~「『と』から始まる作品を探す」をRecyclerViewで表示)
③各作品名をRecyclerViewで表示
④作品の本文ページ(XHTML版ページ)をWebViewで表示という感じです。
画面外の動きとしては
・画面遷移の際にintentでクリック位置を渡しています。
・③においてAsyncTaskでweb上の作品一覧ページのHTMLファイルを取得し、キャッシュファイルに保存後、アクティビティからそれを読み込みRecyclerView表示用のリストを生成しています。
・また、④においてWebViewで表示するURLを生成するために、作品一覧ページ、図書カードページの読み込みを行っています。
問題
エラーは出ていないのですが、②の画面での選択後に、そこで選択したものとは違う③の画面がつくられます。
たとえば、②で「『き』から始まる作品を探す」を選択したのに③では「あ」から始まる作品が表示されるという感じです。
一度①まで戻って次に「い」を選ぶなどすると「き」の作品一覧が表示されたりするので、どうやら前回選択したものが表示されるらしく、作品一覧ページのHTML取得/キャッシュへの保存に問題があるのではと考えています。
実現したいこと
- 作品一覧の表示・選択の機能が正しく動作するようにする
該当のソースコード
(webファイル取得)
Java
1public class AsyncHttpRequest extends AsyncTask<URL, Void, String> { 2 private Activity mainActivity; 3 protected String resultText; 4 public AsyncHttpRequest(Activity activity){ 5 this.mainActivity = activity; 6 } 7 8 @Override 9 protected String doInBackground(URL[] urls) throws NullPointerException { 10 //書き込む場所・ファイル名の指定 11 Context context = mainActivity.getApplicationContext(); 12 File file = new File(context.getCacheDir(), "aozoraBunko.html"); 13 resultText = ""; 14 15 //http接続・web上のデータ取得 16 HttpURLConnection urlCon = null; 17 StringBuilder stringBuilder = new StringBuilder(); 18 try { 19 urlCon = (HttpURLConnection) urls[0].openConnection(); 20 urlCon.setRequestMethod("GET"); 21 } catch (IOException e) { 22 e.printStackTrace(); 23 } 24 PrintWriter pw = null; 25 String result = null; 26 try { 27 urlCon.connect(); 28 29 InputStream in = urlCon.getInputStream(); 30 BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); 31 32 String line = ""; 33 while ((line = reader.readLine()) != null) { 34 stringBuilder.append(line); 35 } 36 in.close(); 37 38 //書き込み 39 FileWriter fw = new FileWriter(file, false); 40 BufferedWriter bw = new BufferedWriter(fw); 41 pw = new PrintWriter(bw); 42 result = stringBuilder.toString(); 43 result = result.replace("\\",""); 44 result = result.replace("%",""); 45 pw.printf(result); 46 urlCon.disconnect(); 47 pw.close(); 48 49 } catch (IOException e) { 50 e.printStackTrace(); 51 } catch (NullPointerException e) { 52 e.printStackTrace(); 53 } finally { 54 } 55 return result; 56 } 57 58 }
②の表示、クリックリスナーを担うRecyclerViewAdapter
Java
1public class SakuhinIchiranRecyclerviewAdapter extends RecyclerView.Adapter<AtoWaRecyclerViewHolder>{ 2 private List<RowData> list; 3 4 public SakuhinIchiranRecyclerviewAdapter(List<RowData> list){ 5 this.list = list; 6 } 7 8 @Override 9 public AtoWaRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 10 View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.bookname_recycler_layout,parent,false); 11 AtoWaRecyclerViewHolder vh = new AtoWaRecyclerViewHolder(inflate); 12 return vh; 13 } 14 15 @Override 16 public void onBindViewHolder(AtoWaRecyclerViewHolder holder, int position) { 17 holder.titleView.setText(list.get(position).getTitle()); 18 holder.detailView.setText(list.get(position).getDetail()); 19 20 holder.itemView.setOnClickListener(new View.OnClickListener() { 21 @Override 22 public void onClick(View v) { 23 Intent intent = new Intent(v.getContext(), ReadfromSakuhinmeiActivity.class); 24 int position = holder.getLayoutPosition(); 25 String sakkaSeq = SakuhinIchiranActivity.sakka.get(position); 26 String cardSeq = SakuhinIchiranActivity.card.get(position); 27 String firstURL = "https://www.aozora.gr.jp/cards/" + sakkaSeq +"/" + cardSeq + ".html"; 28 intent.putExtra("sakka", sakkaSeq); 29 URL url = null; 30 try { 31 url = new URL(firstURL); 32 } catch (MalformedURLException e) { 33 e.printStackTrace(); 34 } 35 AsyncHttpRequest2 task = new AsyncHttpRequest2((Activity) v.getContext()); 36 task.execute(url); 37 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 38 ((Activity) v.getContext()).finish(); 39 SakuhinIchiranActivity.sakka.clear(); 40 SakuhinIchiranActivity.card.clear(); 41 v.getContext().startActivity(intent); 42 43 } 44 }); 45 46 } 47 @Override 48 public int getItemCount(){ 49 return list.size(); 50 } 51} 52
③のアクティビティ
Java
1public class SakuhinIchiranActivity extends AppCompatActivity { 2 public static List<String> sakka = new ArrayList<>();//④でのURL生成用のリスト 3 public static List<String> card = new ArrayList<>();//④でのURL生成用 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_sakuhin_ichiran); 9 10 Intent intent = this.getIntent(); 11 int shiin = intent.getIntExtra("shiin",0); 12 int boin = intent.getIntExtra("boin",0); 13 14 15 String[] persons1 = {"", "k", "s", "t", "n", "h", "m", "y", "r", "w"}; 16 String[] persons2 = {"a", "i", "u", "e", "o"}; 17 String urltext = "https://www.aozora.gr.jp/index_pages/sakuhin_" + persons1[shiin] + persons2[boin] + "1.html"; 18 URL url = null; 19 try { 20 url = new URL(urltext); 21 } catch (MalformedURLException e) { 22 e.printStackTrace(); 23 } 24 //AsyncHttpRequest task = new AsyncHttpRequest(this); 25 //task.execute(url); 26 27 List<RowData> dataset = new ArrayList<>(); 28 dataset = this.createDataset(); 29 30 RecyclerView recyclerView = findViewById(R.id.sakuhinIchiranRecyclerView); 31 SakuhinIchiranRecyclerviewAdapter adapter = null; 32 try{ 33 adapter = new SakuhinIchiranRecyclerviewAdapter(dataset); 34 }catch (Exception e){ 35 e.printStackTrace(); 36 } 37 38 LinearLayoutManager llm = new LinearLayoutManager(this); 39 recyclerView.setHasFixedSize(true); 40 recyclerView.setLayoutManager(llm); 41 recyclerView.setAdapter(adapter); 42 } 43 44 private List<RowData> createDataset(){ 45 Context context = this; 46 List<RowData> rowData = new ArrayList<>(); 47 48 File file = new File(context.getCacheDir(),"aozoraBunko.html"); 49 String result = ""; 50 try { 51 BufferedReader bufferedReader = new BufferedReader(new FileReader(file.getPath())); 52 String texts = ""; 53 StringBuilder stringBuilder = new StringBuilder(); 54 while((texts = bufferedReader.readLine()) != null){ 55 stringBuilder.append(texts); 56 } 57 result = stringBuilder.toString(); 58 bufferedReader.close(); 59 } catch (FileNotFoundException e) { 60 e.printStackTrace(); 61 } catch (IOException e) { 62 e.printStackTrace(); 63 } 64 result = result.substring(result.indexOf("<center>")+8,result.indexOf("</center>")); 65 String[] words = result.split("<tr vAlign=\"top\">"); 66 words[0] = "html\">&</a>" ; 67 words[1] = "html\">&</a>" ; 68 69 for(int i=2;i< words.length;i++){ 70 int first_divide = words[i].indexOf("cards")+6; 71 int second_divide = words[i].indexOf(".html"); 72 String urlseq=""; 73 urlseq = words[i].substring(first_divide,second_divide); 74 String toSakka = urlseq.split("/")[0]; 75 String toCard = urlseq.split("/")[1]; 76 sakka.add(toSakka); 77 card.add(toCard); 78 } 79 80 List<String> sakuhin = new ArrayList<>(); 81 Pattern pattern = Pattern.compile("/cards/(\\d*)/card(\\d*)\\.html\">(.*)</a>"); 82 for(int i =2 ;i< words.length;i++) { 83 Matcher match = pattern.matcher(words[i]); 84 while(match.find()){ 85 sakuhin.add(match.group(3)); 86 } 87 } 88 89 for(int i=0; i<sakuhin.size();i++){ 90 RowData data = new RowData(); 91 data.setTitle(Integer.toString(i+1)); 92 data.setDetail(sakuhin.get((i) )); 93 rowData.add(data); 94 } 95 96 return rowData; 97 } 98 99}
試したこと
getCacheDir()をgetFilesDir()にする、書き込みの前にfile.delete();で前回作られたファイルを消すなどしましたが解決できませんでした(後者に至ってはエラーで動作せず(ファイルが存在しないということでしょうか?))。
回答1件
あなたの回答
tips
プレビュー