したがって、5か月のWeb開発の後、Androidに戻る必要がありましたが、古いコードの一部がもう機能していないことに気付きました。RecyclerViewにデータ用のアダプターがありますが、アイテムは何にも反応しませんこれは私のコードは次のようになります:
public class ProjectAdapter extends RecyclerView.Adapter<ProjectAdapter.ViewHolder> {
private List<Project> itemsData;
OnItemClickListener mItemClickListener;
public ProjectAdapter(List<Project> itemsData) {
this.itemsData = itemsData;
}
// Create new views (invoked by the layout manager)
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new views
View itemLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_layout, parent, false);
// create ViewHolder
ViewHolder vh = new ViewHolder(itemLayoutView);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.txtViewId.setText(String.valueOf(itemsData.get(position).getId()));
viewHolder.txtViewName.setText(itemsData.get(position).getName());
}
// inner class to hold a reference to each item of RecyclerView
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public TextView txtViewName, txtViewId;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);
}
@Override
public void onClick(View v) {
System.out.println("onClick");
TextView tv = (TextView) v.findViewById(R.id.item_name);
String id = tv.getText().toString();
mItemClickListener.onItemClick(v, getAdapterPosition(), id); //OnItemClickListener mItemClickListener;
}
}
public interface OnItemClickListener {
public void onItemClick(View view, int position, String id);
}
public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
// Return the size of your itemsData (invoked by the layout manager)
@Override
public int getItemCount() {
return itemsData.size();
}
}
ProjectsActivity.Java
projectAdapter.SetOnItemClickListener(new ProjectAdapter.OnItemClickListener() {
@Override
public void onItemClick(View v, int position, String id) {
System.out.println("onItemClick" + id);
ActionActivity(id);
}
});
リストが表示され、クリックは機能せず、コンソールへのログも機能しません。誰かが私が間違っていることを知っていますか?コンパイルSDKバージョンとしてSDK v23を使用しています。私の最小SDKバージョンはv19です。
次のようなビューを見つけた後にクリックを追加します。
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);
// here
itemLayoutView.setOnClickListener(this);
}
アイテムクリックリスナーをリサイクラービューの行に設定します。
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
itemLayoutView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
TextView tv = (TextView) v.findViewById(R.id.item_name);
String id = tv.getText().toString();
mItemClickListener.onItemClick(getLayoutPosition(), v, id);
}
});
txtViewName = (TextView) itemLayoutView.findViewById(R.id.item_name);
txtViewId = (TextView) itemLayoutView.findViewById(R.id.item_id);
}
ClickListener
をtextView
またはAnythingに設定していません。 View
が呼び出すonClick
は何ですか?
ステップ1:コンストラクターを変更する
public ProjectAdapter(List<Project> itemsData,OnItemClickListener itemClickListener) {
this.itemsData = itemsData;
onItemClickListener = itemClickListener;
}
ステップ2:インターフェイスへの参照を与える
public MyViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
}
ステップ3:アクティビティーまたはフラグメントからアダプターにリスナーを与える
MyAdapter myAdapter = new MyAdapter (list, this);