recyclerView.addOnItemTouchListener未注册click

时间:2016-11-04 19:40:15

标签: android android-recyclerview

我正在开发一款应用。此应用程序最初下载一个GPS标记图像包。现在,我在主屏幕上显示了回收站视图中的列表。这是包中图像的名称列表。它们按照移动设备的y轴和连接移动设备的原点和图像的gps位置之间的角度的升序列出。我正在使用magnetometeraccelormeter来查找相关的角度数据,并从移动设备获取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;
&#13;
&#13;

我使用recyclelerView()方法在排序后设置屏幕。

所以基本上就是onLocationChanged-->computeNearby-->refershRecylerViewonSensorChanged-->computeNearby-->refershRecylerView

但是当我点击任何列表视图项时,没有注册点击。当我仅从onLocationChanged调用computeNearby时,将注册项目单击并启动相关活动。我认为处理onSensorChanged存在问题。请帮帮我。

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您还有很多其他方法可以处理Click。但我建议你在ViewHolder里面处理。

  1. 将您的数据存储到ViewHolder
  2. 包含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;
    }
    }