2012-04-01 9 views
2

通常のクリックリスナーと長いListenerを追加したいListFragmentがあります。ListFragmentのClickListenerとLongClickListener

ListFragmentのonListItemClick()メソッドをオーバーライドします。ここで問題なく動作します。

は、それから私は私がgetViewメソッド()メソッドでsetOnLongClickListener()を介してOnLongClickListenerを追加したアダプタ作成:今

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 => it works"); 
        ; 
        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<QuestionBean> temp = new ArrayList<QuestionBean>(); 
     if (questions != null && questions.getQuestionList() != null) { 
      for (QuestionBean question : questions.getQuestionList()) { 
       if (question.isActivated()) { 
        temp.add(question); 
       } 
      } 
      questions.setQuestionList(temp); 
     } 

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

、longClickListenerの作品をしかしもうない通常のクリックは、(実際には1時間のように動作します任意のアイデア10、または15または20のうち(それが依存して...)。

私は両方のリスナーを設定すると、onListItemClick()が動作しない理由はわかりません。

ありがとうございます。

EDIT:私の行のXML

<TextView 
     android:id="@+id/itemFragmentQuestions" 
     style="@style/ItemFragmentQuestion" 
     android:layout_marginBottom="@dimen/itemFragmentQuestionsMarging" 
     android:background="@drawable/background_validated" > 
    </TextView> 

</LinearLayout> 

EDIT:

マイListFragmentクラス:

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("Menu Title"); 
     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 here 
     } else if (item.getTitle() == "Option 2") { 
      // Option 2 code here 
     } 
     return super.onContextItemSelected(item); 
    } 
} 

@Barakあなたが見ることができるように、私は()onCreateViewにアダプタを設定私がregisterForContextMenu(getListView())を直後に置くと、エラーが発生します。 getListView()がまだ設定されていないようです。

+0

:-)治癒創傷を引き裂くため申し訳ありませんが、各行にビューにAdapterView.OnItemLongClickListenerを使用してではなく、OnLongClickListenerしようとしたことがありますか? – pouzzler

+0

はまだ:( – Nico

+0

は、あなたの行のXMLは同じ提供していただけますか? – pouzzler

答えて

2

アダプターではなく、長いクリックのためにコンテキストメニューを使用してみませんか?

registerForContextMenu(getListView()); 

、その後:

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    menu.setHeaderTitle("Menu Title"); 
    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 here 
    } else if (item.getTitle().equals("Option 2")) { 
     // Option 2 code here 
    } 
    return super.onContextItemSelected(item); 
} 
+0

を。 – Nico

+0

を置かない – Barak

+0

私は質問を更新しました。をありがとうあなたの助けを借りてください – Nico

1

を私はあなたの代わりにlistView.setOnLongClickListener(...);listView.setOnItemLongClickListener(...);を使うべきだと思います。

関連する問題