我正在开发一款应用。此应用程序最初下载一个GPS标记图像包。现在,我在主屏幕上显示了回收站视图中的列表。这是包中图像的名称列表。它们按照移动设备的y轴和连接移动设备的原点和图像的gps位置之间的角度的升序列出。我正在使用magnetometer
和accelormeter
来查找相关的角度数据,并从移动设备获取GPS位置。
现在,每当GPS位置或传感器数据发生变化时,我都会调用computeNearby()
来计算列表中项目的顺序。当我点击某个项目时,它会打开另一个活动。
这是我的代码
private void refreshRecyclerView() {
//setting the view of the NEARBY tab
// Log.v(LOGTAG, "going to set sorted interest points");
recyclerViewAdapter = new NearbyPointsRecyclerViewAdapter(sortedInterestPoints);
recyclerView.setAdapter(recyclerViewAdapter);
recyclerView.setItemAnimator(new DefaultItemAnimator());
// Log.v(LOGTAG, "Set sorted interest points and going to set OnItemTouchListener for recycler view");
recyclerView.addOnItemTouchListener(
new RecyclerViewOnItemClickListener(getActivity(), new RecyclerViewOnItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Log.v(LOGTAG,"onItemClick registered in RecyclerViewOnItemClickListener");
RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForLayoutPosition(position);
//getting the title of the clicked interest point
TextView textView = (TextView) viewHolder.itemView.findViewById(R.id.cardview_text);
String text = textView.getText().toString();
Intent intent_interest_point = new Intent(getActivity(), InterestPointActivity.class);
//passing the title of the clicked interest point to InterestPintActivity
intent_interest_point.putExtra("interest_point", text);
Log.v(LOGTAG,"InterestPointActivity is called");
startActivity(intent_interest_point);
}
})
);
}
@Override
public void onLocationChanged(Location location) {
currentLatitude = location.getLatitude();
currentLongitude = location.getLongitude();
//Toast.makeText(_context, currentLatitude + " WORKS " + currentLongitude + "", Toast.LENGTH_LONG).show();
computeNearby(currentLatitude, currentLongitude);
refreshRecyclerView();
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
mGravity = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
mGeomagnetic = event.values;
if (mGravity != null && mGeomagnetic != null) {
float R[] = new float[9];
float I[] = new float[9];
if (SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic)) {
// orientation contains azimuth, pitch and roll
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
oldAzimuth = azimuth;
azimuth = orientation[0];
pitch = orientation[1];
roll = orientation[2];
computeNearby(currentLatitude, currentLongitude);
}
}
}
public void computeNearby(Double currentLatitude, Double currentLongitude) {
//some sorting operations
for (int i=0; i<Math.min(TRUNCATION_LIMIT, interestPoints.size()); i++) {
interestPoint = interestPoints.get(finalThreeAngleIndices.get(i).second);
sortedInterestPoints.set(i, interestPoint);
}
refreshRecyclerView();
}
&#13;
我使用recyclelerView()方法在排序后设置屏幕。
所以基本上就是onLocationChanged-->computeNearby-->refershRecylerView
和onSensorChanged-->computeNearby-->refershRecylerView
。
但是当我点击任何列表视图项时,没有注册点击。当我仅从onLocationChanged调用computeNearby时,将注册项目单击并启动相关活动。我认为处理onSensorChanged存在问题。请帮帮我。
感谢您的时间。
答案 0 :(得分:1)
您还有很多其他方法可以处理Click。但我建议你在ViewHolder里面处理。
包含ViewHolder的视图的SetOnClickListener
public class CardViewHolder extends RecyclerView.ViewHolder {
private Context context;
private Card data;
public CardViewHolder(View view) {
super(view);
titleView = (TextView)view.findViewById(R.id.titleView);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Handle your click listener
}
});
}
public void setContext(Context context) {
this.context = context;
}
public void setData(final Card data) {
this.data = data;
if(data != null) {
titleView.setText(data.name);
}
}
public Card getData() {
return data;
}
}