###(android)RecyclerViewへのクリックイベント実装
ウェブ上においたcsvファイルからリストを生成するRecyclerViewを作成しました。
そこにクリックイベントを実装したいのですが、うまく行かず途方に暮れています。
恥ずかしながら、既存のコードを組み合わせて動作を確かめている段階の入門者です。
質問の仕方、情報の不足などあろうかと思いますが、宜しくお願い致します。
###個人的な推測
ArticleViewAdapter.java内のsetOnItemClickListenerが使用されていないため、その下の条件分岐に入れていないことが原因だと考えています。
問題は繋ぎあわせたコードをきちんと理解していないため、setOnItemClickListenerをどこでどのように呼び出せばよいのか解りません。
ご教授ご指摘を頂ければありがたいです。
###最終的に実現したいこと
ArticleViewActivity.javaで取得しcsv_line_temp[i][3]に格納したURLをタップしたリストの位置に対応して、Webviewに渡したい。
###参考にさせて頂いた記事
RecyclerViewの基本
http://qiita.com/naoi/items/f8a19d6278147e98bbc2
RecyclerViewのアイテムクリック
http://qiita.com/ushi3_jp/items/ba0df2df6b0b77278f14
###補足情報(言語/FW/ツール等のバージョンなど)
Android Studio2.3.3
###プロジェクト全体のソースファイル
http://kidounikki.o0o0.jp/odapp/od_test_01.zip
###ArticleViewActivity.java
public class ArticleViewActivity extends AppCompatActivity{ private RecyclerView mRecyclerView; String[][] csv_line_temp = new String[100][]; int row = 0; List<RowData> dataset = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_titles); mRecyclerView = (RecyclerView) findViewById(R.id.activity_titles); ArticleViewAdapter adapter = new ArticleViewAdapter(this.createDataset()); LinearLayoutManager llm = new LinearLayoutManager(this); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(llm); DividerItemDecoration dividerItemDecoration1 = new DividerItemDecoration(mRecyclerView.getContext(), LinearLayoutManager.VERTICAL); mRecyclerView.addItemDecoration(dividerItemDecoration1); dividerItemDecoration1.setDrawable(ContextCompat.getDrawable(this, R.drawable.divider)); mRecyclerView.setAdapter(adapter); } private List<RowData> createDataset() { class FirstRun implements Runnable{ @Override public void run() { InputStream is = null; BufferedReader br = null; try{ //概ねの操作で例外処理が必要です。 //URLを作成する String adress="http://kidounikki.o0o0.jp/odapp/articles/list.csv"; URL url=new URL(adress);//URLを設定 // URL接続 HttpURLConnection connect = (HttpURLConnection)url.openConnection();//サイトに接続 connect.setRequestMethod("GET");//プロトコルの設定 is = connect.getInputStream();//ファイルを開く br = new BufferedReader(new InputStreamReader(is)); String line = br.readLine(); for (row = 0; line != null; row++) { csv_line_temp[row] = line.split(",", 0); line = br.readLine(); } br.close(); // URL切断 is.close();//InputStreamを閉じる connect.disconnect();//サイトの接続を切断 } catch(Exception e){ Log.d("FileReadError", "eee"); System.out.println(e); } } } new Thread(new Runnable() { @Override public void run() { FirstRun sp = new FirstRun(); Thread t = new Thread(sp); t.start(); try{ t.join(); }catch(InterruptedException e){ //joinはチェック例外のInterruptedExceptionを投げる e.printStackTrace(); } for (int i = row - 1; i > -1; i--) { RowData data = new RowData(); data.setTitle("軌道日記:第" + csv_line_temp[i][0] + "回"); data.setDate(csv_line_temp[i][1]); data.setDetail(csv_line_temp[i][2]); dataset.add(data); } } }).start(); return dataset; } }
###ArticleViewHolder.java
public class ArticleViewHolder extends RecyclerView.ViewHolder { public TextView titleView; public TextView detailView; public TextView dateView; public ArticleViewHolder(View itemView) { super(itemView); titleView = (TextView) itemView.findViewById(R.id.title); detailView = (TextView) itemView.findViewById(R.id.detail); dateView = (TextView) itemView.findViewById(R.id.date); } }
###ArticleViewAdapter.java
public class ArticleViewAdapter extends RecyclerView.Adapter<ArticleViewHolder> implements View.OnClickListener { private final List<RowData> list; public ArticleViewAdapter(List<RowData> list) { this.list = list; } private RecyclerView mRecycler; private OnItemClickListener mListener; @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); mRecycler= recyclerView; } @Override public void onDetachedFromRecyclerView(RecyclerView recyclerView) { super.onDetachedFromRecyclerView(recyclerView); mRecycler = null; } @Override public ArticleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent,false); inflate.setOnClickListener(this); ArticleViewHolder vh = new ArticleViewHolder(inflate); return vh; } @Override public void onBindViewHolder(ArticleViewHolder holder, int position) { holder.titleView.setText(list.get(position).getTitle()); holder.detailView.setText(list.get(position).getDetail()); holder.dateView.setText(list.get(position).getDate()); } @Override public int getItemCount() { return list.size(); } public void setOnItemClickListener(OnItemClickListener listener) { mListener = listener; } @Override public void onClick(View view) { if (mRecycler == null) { Log.d("RecyclerCheck", "eeeeeeeee"); return; } if (mListener != null) { Log.d("ListerCheck", "eeeeeeeee"); int position = mRecycler.getChildAdapterPosition(view); RowData item = list.get(position); mListener.onItemClick(this, position, item); } Log.d("ListonClick", "eeeeeeeee"); } public static interface OnItemClickListener { public void onItemClick(ArticleViewAdapter adapter, int position, RowData item); } }
###RowData.java
public class RowData { private String title; private String detail; private String date; public String getTitle(){ return this.title; } public String getDetail(){ return this.detail; } public String getDate(){ return this.date; } public void setTitle(String title){ this.title = title; } public void setDetail(String detail){ this.detail = detail; } public void setDate(String date){ this.date = date; } }
###row.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="6dp" android:paddingLeft="5dp" android:paddingRight="5dp" android:paddingTop="5dp"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="5dp" android:paddingRight="5dp" android:gravity="start" android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView android:id="@+id/date" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="5dp" android:paddingRight="10dp" android:gravity="end" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> <TextView android:id="@+id/detail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="20dp" android:paddingRight="10dp" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> </LinearLayout>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。