2 Stimmen

ClickListener UND LongClickListener auf ListFragment

Ich habe einen ListFragment, in dem ich einen normalen Klick-Listener und einen langen hinzufügen möchte.

Ich überschreibe die onListItemClick() Methode im ListFragment. Hier funktioniert es ohne Probleme.

Dann habe ich einen Adapter erstellt, in dem ich über setOnLongClickListener() in der getView() Methode einen OnLongClickListener hinzugefügt habe:

public class QuestionsAdapter extends BaseAdapter {

    private QuestionsBean questions = null;
    private LayoutInflater inflater = null;

    public QuestionsAdapter(LayoutInflater inflater) {
        this.inflater = inflater;
    }

    @Override
    public int getCount() {
        return (questions != null && questions.getQuestionList() != null) ? questions.getQuestionList().size() : 0;
    }

    @Override
    public Object getItem(int position) {
        return (questions != null && questions.getQuestionList() != null) ? questions.getQuestionList().get(position) : null;
    }

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

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

        QuestionBean question = ((QuestionsBean) questions).getQuestionList().get(position);
        if (convertView == null) {
            holder = new ViewHolder();

            convertView = inflater.inflate(R.layout.item_fragment_question, null);

            holder.questionItem = (TextView) convertView.findViewById(R.id.itemFragmentQuestions);
            holder.questionItem.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    System.out.println("Test => Es funktioniert");
                    return false;
                }
            });

            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.questionItem.setText(question.getQuestion());

        return convertView;
    }

    private class ViewHolder {
        TextView questionItem;
    }

    public void setQuestions(QuestionsBean questions) {
        List temp = new ArrayList();
        if (questions != null && questions.getQuestionList() != null) {
            for (QuestionBean question : questions.getQuestionList()) {
                if (question.isActivated()) {
                    temp.add(question);
                }
            }
            questions.setQuestionList(temp);
        }

        this.questions = questions;
        notifyDataSetChanged();
    }
}

Der longClickListener funktioniert jetzt, aber der normale Klick nicht mehr (tatsächlich funktioniert er etwa einmal von 10, 15 oder 20 Mal (es hängt davon ab...).

Ich habe keine Ahnung, warum der onListItemClick() nicht funktioniert, wenn ich beide Listener setze.

Irgendwelche Ideen?

Danke für deine Hilfe.

EDIT: Mein "row" XML

EDIT:

Meine ListFragment-Klasse:

public class QuestionsFragment extends ListFragment {

    public static final int VALIDATED = 1;
    public static final int IN_PROGRESS = 1;
    public static final int NON_OBSERVED = 1;

    private QuestionsAdapter adapter;
    private QuestionsBean questions;

    public QuestionsFragment() {

    }

    public QuestionsFragment(QuestionsBean questions) {
        this.questions = questions;
    }

    public int getShownIndex() {
        return getArguments() != null ? getArguments().getInt("index", 0) : 0;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        this.adapter = new QuestionsAdapter(inflater);
        registerForContextMenu(getListView());

        View questionsView = (LinearLayout) inflater.inflate(R.layout.fragment_questions, null);

        setListAdapter(adapter);

        return questionsView;
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        if (l == this.getListView()) {
            QuestionBean question = (QuestionBean) l.getItemAtPosition(position);
            TextView textView = (TextView) v.findViewById(R.id.itemFragmentQuestions);
            switch (question.getValue()) {
            case QuestionBean.OK:
                question.setValue(QuestionBean.NOK);
                textView.setBackgroundResource(R.drawable.background_in_progress);
                break;
            case QuestionBean.NOK:
                question.setValue(QuestionBean.NA);
                textView.setBackgroundResource(R.drawable.background_non_observed);
                break;
            case QuestionBean.NA:
                question.setValue(QuestionBean.OK);
                textView.setBackgroundResource(R.drawable.background_validated);
                break;
            }
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        refresh(this.questions);
    }

    public void refresh(QuestionsBean questions) {
        this.questions = questions;
        adapter.setQuestions(questions);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("Menütitel");
        menu.add(0, v.getId(), 0, "Option 1");
        menu.add(0, v.getId(), 0, "Option 2");
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        if (item.getTitle() == "Option 1") {
            // Option 1 Code hier
       } else if (item.getTitle() == "Option 2") {
            // Option 2 Code hier
       }
        return super.onContextItemSelected(item);
    }
}

@Barak Wie du sehen kannst, setze ich den Adapter in onCreateView() und wenn ich registerForContextMenu(getListView()) direkt danach setze, erhalte ich einen Fehler. Es scheint, dass getListView() noch nicht festgelegt ist.

2voto

Barak Punkte 16300

Warum nicht ein Kontextmenü für den langen Klick verwenden, anstatt sich im Adapter herumzuschlagen?

registerForContextMenu(getListView());

und dann:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle("Menütitel");
    menu.add(0, v.getId(), 0, "Option 1");
    menu.add(0, v.getId(), 0, "Option 2");
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    if (item.getTitle().equals("Option 1")) {
        // Option 1 Code hier 
   } else if (item.getTitle().equals("Option 2")) {
        // Option 2 Code hier
   }
    return super.onContextItemSelected(item);
}

2voto

dbm Punkte 10126

Ich denke, du solltest listView.setOnItemLongClickListener(...); anstelle von listView.setOnLongClickListener(...); verwenden.

Entschuldigung, dass ich alte Wunden aufgerissen habe :-)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X