【问题标题】:Why isn't my onitemlongclick listener working?为什么我的 onitemlongclick 监听器不工作?
【发布时间】:2016-03-23 03:02:33
【问题描述】:

来自 MainActivity:

public class MainActivity extends ListActivity implements AdapterView.OnItemLongClickListener {
    private DataSourceSql mDataSourceSql;
    protected ArrayList<String> mProfileNames;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDataSourceSql = new DataSourceSql(MainActivity.this);
        mNames = new ArrayList<String>();

        //this part here
        ListView lv = (ListView) findViewById(android.R.id.list);
        lv.setLongClickable(true);
    }

在这种情况下,ListView 的 id 在 XML 中设置为 android:id="@android:id/list"

然后在同一个活动中:

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Toast.makeText(this, mNames.get(position), Toast.LENGTH_SHORT).show();
}

@Override
public boolean onItemLongClick(AdapterView<?> l, View v, final int position, long id) {
    Toast.makeText(this, "long clicked: " + mNames.get(position), Toast.LENGTH_LONG).show();
    return true;
}

但是当我长按列表中的一个项目时,唯一触发的是onListItemClick。我从来没有通过长按收到消息。

【问题讨论】:

标签: android android-studio onclicklistener onitemclicklistener onitemlongclicklistener


【解决方案1】:

你不应该直接在你的 onCreate() 中实现像 AdapterView.OnItemLongClickListener 这样的接口。只需使用你的旧方法(你的类实现这个接口)并且每个方法覆盖,你必须这样写:

lv.setOnItemLongClickListener(this);
lv.setonListItemLongClickListener(this);

【讨论】:

    【解决方案2】:

    我想我明白了,但如果我遗漏了什么,请有人纠正我。

    我删除了“implements...”这件事,然后在 onCreate 方法中添加了以下内容:

    lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener
                    () {
                @Override
                public boolean onItemLongClick(AdapterView<?> av, View v, int
                        pos, long id) {
                    onListItemLongClick(v, pos, id);
                    return false;
                }
            });
    

    虽然我不确定我应该在那里返回 true 还是 false。

    我还将下面的长按功能更改为

    public boolean onListItemLongClick(View v, final int position, long id) {
        Toast.makeText(this, "long clicked: " + mNames.get(position), Toast.LENGTH_LONG).show();
        return true;
    }
    

    编辑:

    更快的方法是在 OP 中将 lv.setOnItemLongClickListener(this); 添加到我的 onCreate 方法中。

    【讨论】:

    • 如果您的Activity 实现了OnItemLongClickListener 接口,那么您只需调用lv.setOnItemLongClickListener(this);
    【解决方案3】:

    使用这个。你的问题会解决的。

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Toast.makeText(MainActivity.this, "Click", Toast.LENGTH_SHORT).show();
                }
            });
            listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    
                    Toast.makeText(MainActivity.this, "Long Click", Toast.LENGTH_SHORT).show();
                    return true;
                }
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-11
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 2013-07-12
      相关资源
      最近更新 更多