我正在尝试在回收站视图中选择卡时启动详细信息活动。我正在使用界面并单击侦听器将单击发送到片段,但是当触摸卡时,没有任何反应。
我的适配器看起来像这样......
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();
}
}
答案 0 :(得分:2)
实施RecyclerView.OnItemTouchListener代替我工作。
更新: 如果您通常将RecyclerView.ViewHolder与RecyclerView.Adapter结合使用,则可以在RecyclerView.ViewHolder上使用View.OnClickListener。