Я не могу установить прослушиватель LongClick

Новейшее редактирование ------------------------------------------------ ---------------------------- Я обновил код, и теперь он правильный, хотя я не могу запустить функциональность. При длинном клике ничего не происходит...


В моем файле, который отображает список строк из базы данных, я помещаю код для установки 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;
            }
        });

person lisoslaw    schedule 18.04.2014    source источник


Ответы (2)


ListView listView = new ListView(this);

Вы должны передать конструктору ListView контекст, а не объект MyDiary.

Исправьте это с помощью

ListView listView = new ListView(Monday.this);

Это должно работать, так как ваш MyDiary является внутренним классом Monday и не является статичным.

Если вы измените это, вы должны передать конструктору MyDiary Context действия и использовать его.


И для вашего следующего вопроса: вы должны использовать OnItemLongClickListener в ListView, а не OnLongClickListener.

person Marco Acierno    schedule 18.04.2014
comment
Ваш ответ исправил мою ошибку. А не подскажете, почему диалог не запускается при LongClick? - person lisoslaw; 18.04.2014
comment
Вы изменили onLongClick с помощью setOnItemLongClickListener? - person Marco Acierno; 18.04.2014
comment
теперь он жалуется, что: View.OnItemLongClickListener не может быть разрешен к типу - person lisoslaw; 18.04.2014
comment
Где вы его изменили? - person Marco Acierno; 18.04.2014
comment
Я изменил это: listView.setOnItemLongClickListener(new View.OnItemLongClickListener() {//вторая строка кода - person lisoslaw; 18.04.2014
comment
Может быть, вы пропустили импорт? добавьте это в начало файла import android.widget.AdapterView.OnItemLongClickListener; - person Marco Acierno; 18.04.2014
comment
все еще жалуется, что View.OnItemLongClickListener не может быть разрешен к типу - person lisoslaw; 18.04.2014
comment
попробуй изменить вид. с помощью адаптера View. // AdapterView.OnItemLongClickListener - person Marco Acierno; 18.04.2014
comment
- AdapterView не может быть преобразован в тип - Метод setOnItemLongClickListener(AdapterView.OnItemLongClickListener) в типе AdapterView‹ListAdapter› неприменим для аргументов (новый OnItemLongClickListener(){}) - person lisoslaw; 18.04.2014
comment
Чтение комментария в другом ответе: вы также должны импортировать ListView import android.widget.ListView; - person Marco Acierno; 18.04.2014
comment
Измените новый OnItemLongClickListener на новый View.OnItemLongClickListener - person Marco Acierno; 18.04.2014
comment
Измените новый OnItemLongClickListener на новый View.OnItemLongClickListener => вы пробовали? - person Marco Acierno; 18.04.2014
comment
в этом случае он говорит, что View.OnItemLongClickListener не может быть разрешен к типу - person lisoslaw; 18.04.2014
comment
вы добавили весь импорт? - person Marco Acierno; 18.04.2014
comment
Я обновил свой вопрос, чтобы дать вам представление о том, как он выглядит сейчас. - person lisoslaw; 18.04.2014
comment
@MarcoAcierno есть идеи, почему жалуются View.OnItemLongClickListener? - person lisoslaw; 18.04.2014
comment
Если он говорит, что не может быть преобразован в тип, это означает, что вы пропустили импорт. Пожалуйста, используйте автоматический импорт в вашей IDE - person Marco Acierno; 18.04.2014
comment
Измените свой onLongClick(View v) с помощью onItemLongClick(AdapterView‹?› parent, View view, int position, long id) - person Marco Acierno; 18.04.2014
comment
@MarcoAcierno хорошо, новый код не приносит новых ошибок, но старый остается. - person lisoslaw; 18.04.2014
comment
теперь я изменил View.OnItemLongClickListener на AdapterView, и ошибка исчезла, хотя теперь v в 5-й полосе жалуется, что ее невозможно решить. - person lisoslaw; 18.04.2014
comment
@MarcoAcierno Я изменил этот v на просмотр, и теперь ошибок нет вообще, но я не уверен, что код правильный. Я обновлю его в своем вопросе. - person lisoslaw; 18.04.2014
comment
@MarcoAcierno, достаточно ли тогда использовать функцию длинного щелчка в моем списке? - person lisoslaw; 18.04.2014
comment
Почему бы просто не протестировать это? В любом случае да. - person Marco Acierno; 18.04.2014
comment
@MarcoAcierno, когда я запускаю код, строки в моем списке кликабельны, но ничего не происходит. Я предполагаю, что файл диалога не запускается - person lisoslaw; 18.04.2014
comment
@MarcoAcierno, не могли бы вы помочь мне с этим OnItemLingClick? Я потратил целый день на поиск решения и не могу понять, почему диалог не появляется... - person lisoslaw; 18.04.2014

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;
        }
    });
person GrIsHu    schedule 18.04.2014
comment
когда я использую ваш ответ, eclipse возвращает несколько ошибок. - listView не может быть разрешен - OnItemLongClickListener не может быть преобразован в тип, а метод onItemLongClick(AdapterView‹?›, View, int, long) типа new OnItemLongClickListener(){} должен переопределить или реализовать метод супертипа - person lisoslaw; 18.04.2014
comment
@lisoslaw Просто импортируйте строку import android.widget.AdapterView.OnItemLongClickListener; и проверьте. ИЛИ нажмите Ctrl+Shift+O - person GrIsHu; 18.04.2014
comment
изменил его и импортировал. Теперь ошибка listView не может быть разрешена в первой строке вашего кода. - person lisoslaw; 18.04.2014
comment
Я сказал, просто нажмите Ctrl+Shift+O. - person GrIsHu; 18.04.2014
comment
Я сделал это, но ошибки остаются. он говорит, что listView не может быть разрешен // в первой строке listView жалуется - person lisoslaw; 18.04.2014
comment
Это только твой ListView только. Скриншот с ошибками можешь выложить? - person GrIsHu; 18.04.2014
comment
да, это только listView из первой строки, что жалобы listView не могут быть разрешены - person lisoslaw; 18.04.2014
comment
Пожалуйста, обновите код. и выложи скриншот своей ошибки. Убедитесь, что вы импортировали оператор import android.widget.ListView; - person GrIsHu; 18.04.2014
comment
Я не уверен, как вставить скриншот. - person lisoslaw; 18.04.2014
comment
но я также импортировал listView и OnItemLongClickListener - person lisoslaw; 18.04.2014
comment
@GrlsHu теперь ошибок нет, но я все еще не могу запустить Dialog для обновления строк из списка... - person lisoslaw; 19.04.2014