0

我有一個ListView是在一個片段。在onCreateView部分,我已爲該列表設置了一個onItemClickListener,該列表突出顯示ListView中的所選項目。我已經設置了兩個可以在列表中向上和向下導航的ImageButtons。在選擇時,新的已充值(R.layout.selected_row),其TextView已設置爲選定項目的內容(用於保留突出顯示的選定狀態)。不幸的是,當點擊一個項目和/或點擊一個ImageButton時,似乎沒有任何東西被誇大(在列表中也沒有任何明顯的變化)。我認爲,它可能有一些做的適配器SelectedAdapter建設,IE:片段ListView通貨膨脹保持onItemClick選擇不起作用

public SelectedAdapter(Context context, int textViewResourceId, List objects) { 
      super(getActivity(), R.layout.listview_routines, routines); 
     } 

不過,我看不出這將防止發生事情(通脹)。預先感謝任何意見或建議以幫助解決此問題。

片段:

public static class FragmentRoutine extends Fragment { 
    DatabaseHandler db; 
    private ListView routineListView; 
    private List<Routine> routines = new ArrayList<Routine>(); 
    ArrayAdapter<Routine> routineAdapter; 
    Routine longClickedItemRoutines; 
    private SelectedAdapter selectedAdapter; 

    public FragmentRoutine() {} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.routines, 
       container, false); 
     db = new DatabaseHandler(getActivity().getApplicationContext()); 
     routineListView = (ListView) rootView.findViewById(R.id.routineList); 
     registerForContextMenu(routineListView); 
     db.closeDB(); 
     if (db.getExerciseCount() != 0) 
      routines.clear(); 
     routines.addAll(db.getAllRoutines()); 
     populateList(); 
     selectedAdapter = new SelectedAdapter(this.getActivity(), 0, routines); 
     selectedAdapter.setNotifyOnChange(true); 
     routineListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
       longClickedItemRoutines = routines.get(position); 
       return false; 
      } 
     }); 
     routineListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView arg0, View view, 
            int position, long id) { 

       selectedAdapter.setSelectedPosition(position); 
      } 
     }); 

     // move up event handler 
     ImageButton btnMoveUp = (ImageButton) rootView.findViewById(R.id.btnMoveUp); 
     btnMoveUp.setOnClickListener(new AdapterView.OnClickListener() { 
      public void onClick(View arg0) { 
       moveUp(); 
      } 
     }); 

     // move down event handler 
     ImageButton btnMoveDown = (ImageButton) rootView.findViewById(R.id.btnMoveDown); 
     btnMoveDown.setOnClickListener(new AdapterView.OnClickListener() { 
      public void onClick(View arg0) { 
       moveDown(); 
      } 
     }); 

     setHasOptionsMenu(true); 
     return rootView; 
    } 

    // Move selected item "up" in the ViewList. 
    private void moveUp(){ 

     int selectedPos = selectedAdapter.getSelectedPosition(); 
     Routine currentRoutine = routines.get(selectedPos); 
     if (selectedPos > 0){ 
      routines.remove(selectedPos); 
      String str = currentRoutine.getTagName(); 
      routines.add(selectedPos-1, currentRoutine); 
      // set selected position in the adapter 
      selectedAdapter.setSelectedPosition(selectedPos-1); 
     } 
    } 

    // Move selected item "down" in the ViewList. 
    private void moveDown(){ 

     int selectedPos = selectedAdapter.getSelectedPosition(); 
     Routine currentRoutine = routines.get(selectedPos); 
     if (selectedPos < routines.size()-1){ 
      routines.remove(selectedPos); 
      String str = currentRoutine.getTagName(); 
      routines.add(selectedPos+1, currentRoutine); 
      // set selected position in the adapter 
      selectedAdapter.setSelectedPosition(selectedPos+1); 
     } 
    } 

    public class SelectedAdapter extends ArrayAdapter<Routine>{ 

     // used to keep selected position in ListView 
     private int selectedPos = -1; // init value for not-selected 

     public SelectedAdapter(Context context, int textViewResourceId, List objects) { 
      super(getActivity(), R.layout.listview_routines, routines); 
     } 

     public void setSelectedPosition(int pos){ 
      selectedPos = pos; 
      // inform the view of this change 
      notifyDataSetChanged(); 
     } 

     public int getSelectedPosition(){ 
      return selectedPos; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View v = convertView; 

      // only inflate the view if it's null 
      if (v == null) { 
       v = getActivity().getLayoutInflater().inflate(R.layout.selected_row, null); 
      } 

      // get text view 
      TextView label = (TextView)v.findViewById(R.id.txtExample); 

      // change the row color based on selected state 
      if(selectedPos == position){ 
       v.setBackgroundColor(Color.CYAN); 
      }else{ 
       v.setBackgroundColor(Color.WHITE); 
      } 

      label.setText(this.getItem(position).toString()); 
      return(v); 
     } 
    } 

    private void populateList() { 
     routineAdapter = new SaveListAdapterT(); 
     routineListView.setAdapter(routineAdapter); 
    } 

    public class SaveListAdapterT extends ArrayAdapter<Routine> { 
     public SaveListAdapterT() { 
      super(getActivity(), R.layout.listview_routines, routines); 
     } 

     @Override 
     public View getView(int position, View view, ViewGroup parent) { 
      if (view == null) 
       view = getActivity().getLayoutInflater().inflate(R.layout.listview_routines, parent, false); 

      Routine currentToDoSave = routines.get(position); 

      TextView name = (TextView) view.findViewById(R.id.name); 
      name.setText(currentToDoSave.getTagName()); 

      return view; 
     } 

    } 
} 

附加信息:

以上(SelectedAdapter)中提到的適配器確實需要我通過routines.add(selectedPos+1, currentRoutine);代替routines.add(selectedPos-1, str);我相信最直接的方式來獲得String值新的。不確定這是否是貢獻者。

回答

0

我會盡力解決ImageButtons無法點擊的問題。 我不喜歡在onCreateView()中有這麼多的GUI代碼,我建議將一些代碼移動到onViewCreated方法。 onViewCreated發生在onCreateView之後。我相信這個問題是框架能夠或不能可靠地設置視圖的時機。顯然使用onViewCreated更可靠。

我的示例代碼:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.routines, 
       container, false); 
    ... 
} 

所以你可以看到我的onCreateView只設置主視圖。有幾次,這解決了其他SO用戶的問題。