recyclerView中的卡片无法点击

时间:2015-01-30 04:10:15

标签: onclicklistener android-recyclerview android-cardview

我正在尝试在回收站视图中选择卡时启动详细信息活动。我正在使用界面并单击侦听器将单击发送到片段,但是当触摸卡时,没有任何反应。

我的适配器看起来像这样......

package 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);
    }
}

我的片段就像​​这样......

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

1 个答案:

答案 0 :(得分:2)

实施RecyclerView.OnItemTouchListener代替我工作。

请参阅RecyclerView onClick

更新: 如果您通常将RecyclerView.ViewHolder与RecyclerView.Adapter结合使用,则可以在RecyclerView.ViewHolder上使用View.OnClickListener。

相关问题