【问题标题】:I cannot set onLongClick Listener我无法设置 onLongClick 监听器
【发布时间】:2014-06-02 18:51:45
【问题描述】:

最新编辑 --------------------------------------------- ------------------------------------------- 我更新了代码,现在它是正确的,尽管我无法运行该功能。长按事件没有任何反应...


在显示数据库行列表的文件中,我放置了设置OnLongClickListener 的代码,但部分代码(已注释)返回错误:The constructor ListView(Monday.MyDiary) is undefined

这是我插入新代码的文件:

package com.example.classorganizer;


import java.util.ArrayList;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.cookbook.data.Constants;
import com.cookbook.data.MyDB;






public class Monday extends ListActivity {



private static final int MyMenu = 0;
MyDB dba;
DiaryAdapter myAdapter;

private class MyDiary{
    public MyDiary(String t, String c){
        title=t;
        content=c;

        ListView listView = new ListView(this); //here the error pops out
        listView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                new EditListItemDialog(v.getContext()).show();
                return true;
            }
        });

}

    public String title;
    public String content;

}
@Override
protected void onCreate(Bundle savedInstanceState) {
    dba = new MyDB(this);
    dba.open();
    setContentView(R.layout.fragment_monday);



    super.onCreate(savedInstanceState);
    myAdapter = new DiaryAdapter(this);
    this.setListAdapter(myAdapter);
}



private class DiaryAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    private ArrayList<MyDiary> fragment_monday;
    public DiaryAdapter(Context context) {
        mInflater = LayoutInflater.from(context);
        fragment_monday = new ArrayList<MyDiary>();
        getdata();


    }

    public void getdata(){
        Cursor c = dba.getdiaries();
        startManagingCursor(c);
        if(c.moveToFirst()){
            do{
                String title =
                        c.getString(c.getColumnIndex(Constants.TITLE_NAME));
                String content =
                        c.getString(c.getColumnIndex(Constants.CONTENT_NAME));

                MyDiary temp = new MyDiary(title,content);
                fragment_monday.add(temp);
            } while(c.moveToNext());
        }

    }



    @Override
    public int getCount() {return fragment_monday.size();}
    public MyDiary getItem(int i) {return fragment_monday.get(i);}
    public long getItemId(int i) {return i;}
    public View getView(int arg0, View arg1, ViewGroup arg2) {
        final ViewHolder holder;
        View v = arg1;
        if ((v == null) || (v.getTag() == null)) {
            v = mInflater.inflate(R.layout.diaryrow,  null);
            holder = new ViewHolder();
            holder.mTitle = (TextView)v.findViewById(R.id.name);

            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }

        holder.mdiary = getItem(arg0);
        holder.mTitle.setText(holder.mdiary.title);


        v.setTag(holder);

        return v;


    }

    public class ViewHolder {
        MyDiary mdiary;
        TextView mTitle;


    }

}




/** Called when the user clicks the Edit button */
public void visitDiary(View view) {
    Intent intent = new Intent(this, Diary.class);
    startActivity(intent);
}
/** Called when the user clicks the back button */
public void visitSchedule(View view) {
    Intent intent = new Intent(this, DisplayScheduleScreen.class);
    startActivity(intent);
}


}

我还创建了一个对话框文件:

package com.example.classorganizer;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

class EditListItemDialog extends Dialog implements View.OnClickListener {

private View editText;

public EditListItemDialog(Context context) {
    super(context);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.edit_text_dialog);//here is your xml with EditText and 'Ok' and 'Cancel' buttons
    View btnOk = findViewById(R.id.button_ok);
    editText = findViewById(R.id.edit_text);
    btnOk.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    ((TextView) editText).getText().toString();//here is your updated(or not updated) text
    dismiss();
}
}

我不知道如何解决这个问题。我想要实现的是通过长按它们来编辑列表中显示的行的功能。

编辑------------------------------ ------------------------------------

现在代码如下所示:

ListView listView = new ListView(Monday.this);
        listView.setOnItemLongClickListener(new View.OnItemLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                new EditListItemDialog(v.getContext()).show();
                return true;
            }
        });

第二行的 View.OnItemLongClickListener 发生错误

编辑------------------------------ ------------------------------------------

更新代码没有错误,但不确定是否正确:

ListView listView = new ListView(Monday.this);
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                new EditListItemDialog(view.getContext()).show();
                return true;
            }
        });

【问题讨论】:

    标签: android onlongclicklistener


    【解决方案1】:

    Listview 不能有setonLongClickListener 你应该实现setOnItemItemLongClickListener 因为ListView 包含项目列表所以你总是可以实现它的项目长点击监听器如下:

    listView.setOnItemLongClickListener(new OnItemLongClickListener() {
    
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub
                return false;
            }
        });
    

    【讨论】:

    • 当我使用你的答案时,eclipse 返回一些错误。 - listView 无法解析 - OnItemLongClickListener 无法解析为类型,并且类型为 new OnItemLongClickListener(){} 的方法 onItemLongClick(AdapterView>, View, int, long) 必须覆盖或实现超类型方法
    • @lisoslaw 只需导入import android.widget.AdapterView.OnItemLongClickListener; 行并检查。或按Ctrl+Shift+O
    • 更改并导入。现在错误 listView cannot be resolved 在您的代码的第一行弹出
    • 我说按Ctrl+Shift+O
    • 我已经完成了,但仍然存在错误。它说 listView 无法解决 //在第一行 listView 抱怨
    【解决方案2】:
    ListView listView = new ListView(this);
    

    您应该将上下文传递给 ListView 构造函数,而不是 MyDiary 对象。

    使用修复它

    ListView listView = new ListView(Monday.this);
    

    它应该可以工作,因为您的 MyDiary 是 Monday 的内部类并且不是静态的。

    如果你改变它,你应该将活动的Context 传递给 MyDiary 构造函数并使用它。


    并且,对于您的下一个问题:您应该在 ListView 中使用 OnItemLongClickListener,而不是 OnLongClickListener

    【讨论】:

    • 您的回答解决了我的错误。但是你能告诉我为什么对话框在 LongClick 上没有启动吗?
    • 你用 setOnItemLongClickListener 改变了 onLongClick 吗?
    • 现在它抱怨: View.OnItemLongClickListener 无法解析为类型
    • 你在哪里改的?
    • 我改了这个:listView.setOnItemLongClickListener(new View.OnItemLongClickListener() { //第二行代码
    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 2020-12-21
    • 2022-01-17
    相关资源
    最近更新 更多