2017-01-20 8 views
0

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); 
    } 
} 
+0

アダプタで、コールバックインターフェイスを作成し、 'holder.itemview.setOnClickListener()'を使用してonBindView内でonClickを検出することができます – TruongHieu

+0

[RecyclerViewにonItemClickListener()があるのはなぜですか?そしてRecyclerViewはListViewとどう違うのですか?](http://stackoverflow.com/questions/24885223/why-doesnt-recyclerview-have-onitemclicklistener-and-how-recyclerview-is-dif) –

+0

@ cricket_007しかし、これはチュートリアルですすべての要素をクリックして検出するが、私の場合、最後の8行の最初の特別な要素のクリックを検出する必要がある – ItsOdi1

答えて

2
@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()); 
     } 

     holder.type = setting.getType(); 
     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       MySettingHolder holder = (MySettingHolder)(v.getTag()); 
       switch (holder.type) { 

        case 1:       
         // do logout 
         break; 

        case 2:       
         // do other stuff 
         break; 

        default: 
         break; 
       } 
      } 
     }); 

     // set viewholder 
     holder.itemView.setTag(holder); 
    } 

を実装しても、このようなあなたのViewHolderを更新するとSettings.class

に型変数を追加するために思い出させる私のSettingsFragmentです
public class MySettingHolder extends RecyclerView.ViewHolder { 

     public int type; 
     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); 
     } 
    } 
+0

そして**特別な**要素をどのように検出できますか?例えば、最初のもの? getView()メソッドを解決することができません – ItsOdi1

+0

MySettingHolderで変数を設定し、この変数をオンにすることができます。または、カスタム・ビュー・クラスのアプローチに移行することもできます。より複雑ですが、非常に強力です – firegloves

+1

holder.itemView.setOnClickListener .. –

関連する問題