2012-04-01 65 views
2

我有一個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作品,但不正常的點擊了(其實它就像一個時間出10或15或20(這取決於...)。

我不知道爲什麼,當我同時設置監聽器,該onListItemClick()不工作。

任何想法?

感謝您的幫助。

編輯:我行XML

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

</LinearLayout> 

編輯:

我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 2012-04-01 19:31:25

+0

還是一樣:( – Nico 2012-04-01 20:07:09

+0

能否請您提供您行XML? – pouzzler 2012-04-01 20:12:12

回答

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

我在哪裏放置registerForContextMenu(getListView())? – Nico 2012-04-01 20:08:15

+0

後右鍵設置適配器。 – Barak 2012-04-01 20:58:02

+0

我更新的問題。謝謝你的幫助 – Nico 2012-04-01 21:13:14

1

我認爲你應該使用listView.setOnItemLongClickListener(...);而不是listView.setOnLongClickListener(...);

對不起,撕毀傷口癒合:-)