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.