Android 长时间单击停止ListView上的单击操作
我已经阅读了所有的longclick+click侦听器,因此发布了ListView,但找不到解决此问题的方法。根据我读到的帖子,我确信我做的事情是正确的 问题 我的点击手势用于注册,但在将LongClickListener附加到我的列表视图后,只有长点击手势在列表视图中注册。对我所做的有什么想法吗 代码 streamactivity.java(列表视图)Android 长时间单击停止ListView上的单击操作,android,listview,Android,Listview,我已经阅读了所有的longclick+click侦听器,因此发布了ListView,但找不到解决此问题的方法。根据我读到的帖子,我确信我做的事情是正确的 问题 我的点击手势用于注册,但在将LongClickListener附加到我的列表视图后,只有长点击手势在列表视图中注册。对我所做的有什么想法吗 代码 streamactivity.java(列表视图) public类的流性扩展了appcompativity{ 私有列表视图列表视图; /**用户界面操作和设置*/ @凌驾 创建时受保护的void
public类的流性扩展了appcompativity{
私有列表视图列表视图;
/**用户界面操作和设置*/
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u\u\u流);
//将适配器连接到ListView
listView=(listView)findViewById(R.id.stream\u提要);
if(savedInstanceState!=null&!savedInstanceState.isEmpty())
{
lvContent=savedInstanceState.getParcelableArrayList(已还原的用户流);
manager=savedInstanceState.getParcelable(已还原的\u manager\u UTIL);
}否则{
lvContent=newarraylist();
manager=新的DataManagerUtil(本);
}
}
/**设置要单击的每个列表视图项,并启动
*基于选定流对象的新活动。
*
*/
私有void setItemOnClicks(){
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
/*传递流,但传递子流元素的内存地址
而不是包含
*/
流selectedFlow=(流)listView.getItemAtPosition(位置);
意图i=新意图(streamactivity.this、FlowSandBoxActivity.class);
i、 putExtra(“selectedFlow”,selectedFlow);
//包裹要传递给新活动的流对象
星触觉(i);
}
});
setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
显示弹出菜单(streamactivity.this,视图);
返回true;
}
});
}
公共无效显示弹出菜单(上下文ctx,视图v){
弹出菜单弹出=新弹出菜单(ctx,v);
//此活动实现OnMenuItemClickListener
setOnMenuItemClickListener(新的PopupMenu.OnMenuItemClickListener(){
@凌驾
公共布尔onMenuItemClick(菜单项){
开关(item.getItemId())
{
案例R.id.菜单\u删除:
返回true;
违约:
返回false;
}
}
});
弹出。充气(右菜单。菜单\流量\弹出);
popup.show();
}
@凌驾
受保护的void onResume(){
super.onResume();
setItemOnClicks();
}
列表项
流\u stream.xml中的流\u项\u
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="75dp"\
android:longClickable="true"
>
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:textAppearance=
"?android:attr/textAppearanceMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:layout_marginTop="12dp"
android:id="@+id/item_flow_name" />
</RelativeLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
列表视图
stream_feed.xml
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:rowCount="2"
android:columnCount="1">
<include layout="@layout/stream_toolbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_columnSpan="1"
android:layout_gravity="fill_horizontal" />
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/stream_feed"
android:clipToPadding="false"
android:layout_columnSpan="1"
android:layout_gravity="fill_horizontal"
android:layout_row="1">
</ListView>
</GridLayout>
使用showPopUpMenu(视图);
而不是showPopUpMenu(streamActivity.this,view);
创建方法
public void showPopUpMenu(View v) {
PopupMenu popup = new PopupMenu(TheStreamActivity.this, v);
// This activity implements OnMenuItemClickListener
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId())
{
case R.id.menu_delete:
return true;
default:
return false;
}
}
});
popup.inflate(R.menu.menu_flow_popup);
popup.show();
}
更改
onitemlong单击
方法以返回false
而不是true
,这样做会告诉android您希望事件仍由其他侦听器处理。
应该是这样的:
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
showPopUpMenu(TheStreamActivity.this, view);
return false;
}
});
listView.setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
显示弹出菜单(streamactivity.this,视图);
返回false;
}
});
我已经找到了解决方案,现在看起来很直观/愚蠢。也许有人能验证我的假设
如果在XML级别启用或启用android:clickable=“true”android:LongClick=“true”,似乎会阻止编程onClick侦听器正常工作
这对我来说是有意义的,因为我认为在XML级别上,我们有onClick属性,当通过编程实现单击时,该属性的方法是空的。视图正在寻找一个空方法(即不执行任何操作),而不是onClick侦听器方法,或者在设置onClick侦听器之前呈现视图
不太确定,但这是我的解决方案(无论哪种方式,我学到的经验都将是使用编程或基于XML的可点击项)
private void setItemOnClicks(){
//单击时的TODO侦听器不工作
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
/*传递流,但传递子流元素的内存地址
而不是包含
*/
Toast.makeText(TheStreamActivity.this,“SELected”,Toast.LENGTH_LONG.show();
流selectedFlow=(流)listView.getItemAtPosition(位置);
意图i=新意图(streamactivity.this、FlowSandBoxActivity.class);
i、 putExtra(“selectedFlow”,selectedFlow);
//包裹要传递给新活动的流对象
星触觉(i);
}
});
listView.setLongClickable(真);
setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
显示弹出菜单(streamctivity.this、view、position);
返回true;
}
});
}
列表项(请参见
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
showPopUpMenu(TheStreamActivity.this, view);
return false;
}
});
private void setItemOnClicks() {
// TODO On Click Listeners not working
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
/* Passes Flow but passes the memory address of the childFlowElements
instead of the actual object containing the
*/
Toast.makeText(TheStreamActivity.this, "SELected", Toast.LENGTH_LONG).show();
Flow selectedFlow = (Flow) listView.getItemAtPosition(position);
Intent i = new Intent(TheStreamActivity.this, FlowSandBoxActivity.class);
i.putExtra("selectedFlow", selectedFlow);
// Parcels the Flow Object to@ be passed to new activity
startActivity(i);
}
});
listView.setLongClickable(true);
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
showPopUpMenu(TheStreamActivity.this, view, position);
return true;
}
});
}
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="75dp"
android:divider="@android:color/transparent"
android:dividerHeight="15dp">
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
card_view:cardCornerRadius="8dp"
card_view:cardElevation="8dp"
android:foreground="?android:attr/selectableItemBackground">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:textAppearance=
"?android:attr/textAppearanceMedium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:layout_marginTop="12dp"
android:id="@+id/item_flow_name" />
<!-- Flow Symbol Icon item_flow_name-->
<ImageView
android:contentDescription="@string/task_flag_description"
android:id="@+id/item_element_icon"
android:src="@drawable/flag_small_black_outline"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginEnd="125dp"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true" />
<!-- Insert Flow Element Icon -->
<TextView
android:id="@+id/item_element_count"
android:textAppearance=
"?android:attr/textAppearanceSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignLeft="@+id/item_element_icon"
android:layout_marginLeft="25dp" />
<ImageView
android:contentDescription="@string/timer_description"
android:id="@+id/item_time_icon"
android:src="@drawable/timer_black_48dp"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_centerVertical="true"
android:layout_alignStart="@+id/item_element_icon"
android:layout_toRightOf="@+id/item_element_icon"
android:layout_marginLeft="55dp" />
<!-- Insert Flow Element Icon -->
<TextView
android:id="@+id/item_total_time"
android:textAppearance=
"?android:attr/textAppearanceSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignLeft="@+id/item_time_icon"
android:layout_marginLeft="30dp"
android:layout_marginTop="2dp" />
<TextView
android:id="@+id/item_time_units"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/item_time_icon"
android:layout_marginLeft="50dp"
android:layout_alignLeft="@+id/item_time_icon"
android:layout_marginTop="2dp" />
</RelativeLayout>
</android.support.v7.widget.CardView>
</LinearLayout>