这是我在这里粘贴的示例代码 . 我真正想要的是在MainActivity中创建一个项目列表 . 我已经使用了GridView,因为很容易设置你想连续显示多少项 . 在它们之间创建间距也很容易 .

我的目标是在GridView的Item中的ImageView中的Long Press位置打开一个ArcLayout . 因此,我注册了OnTouchListener(以获取触摸位置)和OnLongClickListener(以便在长按时将ArcLayout定位到该位置) .

这似乎适用于除GridView中第一项之外的所有项目 . 出于某种原因onLongClick方法在长按仅用于GridView中的“First Item”时不被调用 .

这看起来很怪异 . 我无法弄清楚为什么“onTouch”正在为“GridView”中唯一的第一项消耗“ACTION_DOWN”事件,而不是传递给“onLongClick方法” .

以下是示例应用程序示例应用程序的链接您可以在Log.d“适配器”中看到,未检测到GridView中第一项的LongClick .

Does registering both OnTouchListener and OnLongClickListener to the same View cause any conflict?

主要活动

public class MainActivity extends AppCompatActivity {

private GridView gridView;
private GridViewAdapter gridViewAdapter;
private ArrayList<Integer> lstIds;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    gridView = (GridView) findViewById(R.id.grid_view);

    lstIds = new ArrayList<Integer>();
    lstIds.add(R.drawable.img_burger);
    lstIds.add(R.drawable.img_ham_burger);
    lstIds.add(R.drawable.img_pancakes);
    lstIds.add(R.drawable.img_pizza);

    gridViewAdapter = new GridViewAdapter(this, lstIds);

    gridView.setAdapter(gridViewAdapter);
}
}

GridView的BaseAdapter

// GridViewAdapter.java

public class GridViewAdapter extends BaseAdapter implements View.OnLongClickListener, View.OnTouchListener {
// Instance Variables
private final String TAG = "Adapter";

private Context context;
private ArrayList<Integer> lstImg;
private int resId;

// CONSTRUCTOR
public GridViewAdapter(Context context, ArrayList<Integer> lstImg) {
    this.context = context;
    this.lstImg = lstImg;
}

// Overridden Methods

@Override
public int getCount() {
    return lstImg.size();
}

@Override
public Object getItem(int position) {
    return lstImg.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.list_item_layout, parent, false);
    }


    ImageView imgItem = (ImageView) convertView.findViewById(R.id.img_view);
    resId = lstImg.get(position);
    imgItem.setImageResource(resId);

    // Enabling the ImageView to be Long Clickable...
    // imgItem.setLongClickable(true);

    imgItem.setOnTouchListener(this);
    imgItem.setOnLongClickListener(this);

    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 250);
    convertView.setLayoutParams(params);

    return convertView;
}

@Override
public boolean onLongClick(View v) {
    Log.d(TAG, "onLongClick called...");

    Toast.makeText(context, "Long Click!", Toast.LENGTH_SHORT).show();

    return false;
}

@Override
public boolean onTouch(View v, final MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN) {

        Log.d(TAG, "onTouch ACTION_DOWN event...");
    }

    return false;
}

}