1

Я пытаюсь запустить подробные действия при выборе карты в режиме просмотра ресайклеров. Я использую интерфейс и прослушиватель кликов, чтобы отправить клик на фрагмент, но при касании карты ничего не происходит.Карты в recyclerView не доступны для просмотра

Мой адаптер выглядит так ...

пакет com.garciaericn.t2d.data;

public class DeviceAdapter extends RecyclerView.Adapter<DeviceAdapter.MyViewHolder> { 

    private LayoutInflater inflater; 
    private Context context; 
    private ClickListener clickListener; 

    List<Device> data = Collections.emptyList(); 

    public DeviceAdapter(Context context, List<Device> data) { 
     inflater = LayoutInflater.from(context); 
     this.context = context; 
     this.data = data; 
    } 

    @Override 

    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.card_layout, parent, false); 

     MyViewHolder holder = new MyViewHolder(view); 

     return holder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 

     Device device = data.get(position); 

     String batteryLevelString = String.valueOf(device.getBatteryLevel()) + "%"; 

     holder.deviceNameTV.setText(device.getDeviceName()); 
     holder.batteryLevelTV.setText(batteryLevelString); 

     if (device.isCharging()) { 
      holder.isChargingTV.setText("Is charging"); 
     } else { 
      holder.isChargingTV.setVisibility(View.GONE); 
     } 

    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     // Temp data set 
     private String[] mDataset; 

     TextView deviceNameTV; 
     TextView batteryLevelTV; 
     TextView isChargingTV; 

     public MyViewHolder(View itemView) { 
      super(itemView); 
      deviceNameTV = (TextView) itemView.findViewById(R.id.device_name_tv); 
      batteryLevelTV = (TextView) itemView.findViewById(R.id.battery_level_tv); 
      isChargingTV = (TextView) itemView.findViewById(R.id.isChargingTV); 
     } 

     @Override 
     public void onClick(View view) { 
      if (clickListener != null) { 
       clickListener.deviceSelected(view, getPosition()); 
      } 
     } 
    } 

    public void setClickListener(ClickListener clickListener) { 
     this.clickListener = clickListener; 
    } 

    public interface ClickListener { 
     public void deviceSelected(View view, int position); 
    } 
} 

И мои фрагменты, как это ...

пакет com.garciaericn.t2d.fragments;

public class DevicesCardViewFragment extends Fragment implements DeviceAdapter.ClickListener { 

    private static final String LOGTAG = "DevicesCardViewFragment"; 
    private OnFragmentInteractionListener mListener; 
    private BatteryHelper mBatteryHelper; 

    private RecyclerView mRecyclerView; 
    private DeviceAdapter mAdapter; 
    private RecyclerView.LayoutManager mLayoutManager; 
    private List<Device> mDevices; 
    private SharedPreferences settings; 

    public DevicesCardViewFragment() { 
     // Required empty public constructor 
     mDevices = new ArrayList<Device>(); 
    } 

    public static DevicesCardViewFragment newInstance() { 
     // Bundle parameters is necessary 

     return new DevicesCardViewFragment(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     settings = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
     mBatteryHelper = new BatteryHelper(getActivity()); 

     // Update stats of current device. 
     loadCurrentDevice(); 

     Toast.makeText(getActivity(), "Battery level: " + mBatteryHelper.getCurrentBatteryLevel() + "%", Toast.LENGTH_LONG).show(); 

     // Update device stats 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_devices_list, container, false); 

     mListener.showAd(); 

     // Obtain recycler view 
     mRecyclerView = (RecyclerView) view.findViewById(R.id.devices_recycler_view); 
     mRecyclerView.setHasFixedSize(true); 

     getDevices(); 

     mAdapter = new DeviceAdapter(getActivity(), mDevices); 

     // Set clickListener 
     mAdapter.setClickListener(this); 
     // Set adapter 
     mRecyclerView.setAdapter(mAdapter); 

     // Set layout manager 
     mLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(mLayoutManager); 


     return view; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnFragmentInteractionListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    private List<Device> getDevices() { 

     ParseQuery<Device> query = ParseQuery.getQuery(Device.DEVICES); 
     query.whereEqualTo("deviceUser", ParseUser.getCurrentUser()); 
     query.findInBackground(new FindCallback<Device>() { 
      @Override 
      public void done(List<Device> devices, ParseException e) { 
       if (e == null) { 
        // Loop through return devices 
        for (Device device : devices) { 
         Device currentDevice = new Device(); 
         currentDevice.setDeviceName(device.getDeviceName()); 
         currentDevice.setBatteryLevel(device.getBatteryLevel()); 
         currentDevice.setIsCharging(device.isCharging()); 
         mDevices.add(currentDevice); 
        } 
        mAdapter.notifyDataSetChanged(); 
       } else { 
        // Something went wrong 
        Toast.makeText(getActivity(), "Error: " + e.toString(), Toast.LENGTH_LONG).show(); 
       } 
      } 
     }); 
     return mDevices; 
    } 

    private void loadCurrentDevice() { 
     if (settings.getBoolean(SettingsFragment.ABOUT, true)) { 
      // Do initial load of device and stats 
      Device newDevice = new Device(); 
      newDevice.setUser(ParseUser.getCurrentUser()); 
      newDevice.setDeviceName(Build.MODEL); 
      newDevice.setBatteryLevel(mBatteryHelper.getCurrentBatteryLevel()); 
      newDevice.setIsCharging(mBatteryHelper.isCharging()); 
      newDevice.saveInBackground(); 
      // Update settings 
      settings.edit() 
        .putBoolean(SettingsFragment.ABOUT, false) 
        .apply(); 
     } else { 
      // Refresh data 
     } 
    } 

    @Override 
    public void deviceSelected(View view, int position) { 
     Log.i(LOGTAG, "Selected position: " + position); 
     Toast.makeText(getActivity(), String.valueOf(position), Toast.LENGTH_SHORT).show(); 
    } 

    public interface OnFragmentInteractionListener { 
     public void showAd(); 
    } 
} 

ответ

2

Реализация RecyclerView.OnItemTouchListener вместо этого сработала для меня.

См RecyclerView onClick

Update: Если вы используете RecyclerView.ViewHolder обычно в сочетании с RecyclerView.Adapter, вы можете использовать View.OnClickListener на RecyclerView.ViewHolder.

Смежные вопросы