RecyclerViewのチュートリアルでクリックリスナーを設定しようとしました。しかし、チュートリアルはすべて、私が最後に試したのは、他のチュートリアルでRecyclerViewを設定していて、すべてのチュートリアルが違って見えているからです。各行のクリックを検出するのを手伝ってください。たとえば、ユーザーが最初の行(ログアウトフィールド)をクリックすると、ユーザーはアプリからログアウトする必要があります。私のすべてのログアウト操作は機能していますが、RecyclerViewのクリックは機能しません。RecyclerViewでクリックとタッチのイベントを検出する必要があります。
マイSettingsAdapter:
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
/**
* Created by Johannes on 19.01.2017.
*/
public class SettingsAdapter extends RecyclerView.Adapter<SettingsAdapter.MySettingHolder> {
private List<Settings> settingList;
public class MySettingHolder extends RecyclerView.ViewHolder {
public ImageView settingImage;
public TextView settingTitle, settingSubtitle;
public MySettingHolder(View view) {
super(view);
settingImage = (ImageView) view.findViewById(R.id.settingImage);
settingTitle = (TextView) view.findViewById(R.id.settingTitle);
settingSubtitle = (TextView) view.findViewById(R.id.settingSubtitle);
}
}
public SettingsAdapter (List<Settings> settingList) {
this.settingList = settingList;
}
@Override
public MySettingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.settings_list_row, parent, false);
return new MySettingHolder(itemView);
}
@Override
public void onBindViewHolder(MySettingHolder holder, int position) {
// Setting for one entry
Settings setting = settingList.get(position);
holder.settingImage.setImageResource(setting.getSettingImageUrl());
// If the settingSubtitle is empty it should be not visible and just the settingTitle
if (setting.getSettingSubtitle().equals("")) {
holder.settingTitle.setText(setting.getSettingTitle());
holder.settingSubtitle.setVisibility(View.GONE);
} else {
holder.settingTitle.setText(setting.getSettingTitle());
holder.settingSubtitle.setText(setting.getSettingSubtitle());
}
}
@Override
public int getItemCount() {
return settingList.size();
}
}
これは私がRecyclerView
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CalendarView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import static android.content.Context.MODE_PRIVATE;
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link SettingsFragment.OnFragmentInteractionListener} interface
* to handle interaction events.
* Use the {@link SettingsFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class SettingsFragment extends Fragment {
// Variables
private OnFragmentInteractionListener mListener;
// Variables for Recycler View
private List<Settings> settingList = new ArrayList<>();
private RecyclerView accountRecyclerView;
private SettingsAdapter aAdapter;
public SettingsFragment() {
// Required empty public constructor
}
//Change the title in action bar
public void onResume(){
super.onResume();
String titleString = getResources().getString(R.string.title_activity_navigation_drawer_settings);
// Set title bar
((NavigationDrawerActivity) getActivity())
.setActionBarTitle(titleString);
}
public static SettingsFragment newInstance() {
SettingsFragment fragment = new SettingsFragment();
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_settings, container, false);
accountRecyclerView = (RecyclerView) view.findViewById(R.id.account_recycler_view);
aAdapter = new SettingsAdapter(settingList);
RecyclerView.LayoutManager aLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext()) {
// Disable scrolling in the RecyclerView
@Override
public boolean canScrollVertically() {
return false;
}
};
// Setup account RecyclerView
accountRecyclerView.setLayoutManager(aLayoutManager);
accountRecyclerView.setItemAnimator(new DefaultItemAnimator());
prepareAccountData();
accountRecyclerView.setAdapter(aAdapter);
return view;
}
private void prepareAccountData() {
// Create new setting
Settings setting = new Settings(R.drawable.ic_menu_logout, "Abmelden", "Deine Daten bleibe erhalten");
// Add Object to list
settingList.add(setting);
// Notify data changes
aAdapter.notifyDataSetChanged();
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
@Override
public void onStart() {
super.onStart();
try {
mListener = (OnFragmentInteractionListener) getActivity();
} catch (ClassCastException e) {
throw new ClassCastException(getActivity().toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
アダプタで、コールバックインターフェイスを作成し、 'holder.itemview.setOnClickListener()'を使用してonBindView内でonClickを検出することができます – TruongHieu
[RecyclerViewにonItemClickListener()があるのはなぜですか?そしてRecyclerViewはListViewとどう違うのですか?](http://stackoverflow.com/questions/24885223/why-doesnt-recyclerview-have-onitemclicklistener-and-how-recyclerview-is-dif) –
@ cricket_007しかし、これはチュートリアルですすべての要素をクリックして検出するが、私の場合、最後の8行の最初の特別な要素のクリックを検出する必要がある – ItsOdi1