2014-10-01 4 views
0

У меня есть фрагмент андроида, который имеет listview. для этого списка я реализовал внутренний класс OnItemClickListener. Когда есть щелчок, я сохраняю выделение в глобальной переменной SelectedIndex.Проблемы с глобальной переменной во внутреннем классе OnItemClickListener

Если я снова нажму на этот список, я правильно посмотрю предыдущий выбор, поэтому он правильно сохранит состояние в глобальной переменной.

Проблема заключается в том, что я пытаюсь получить доступ к той же глобальной переменной из другого внутреннего класса, например, один класс, используемый для прослушивания кликов на кнопке. Всегда показывает значение, которое я использовал для инициализации varialbe (-1).

Код фрагмента:

/** 
* A placeholder fragment containing the view for the recentCalls list 
*/ 
public class RecentCallsFragment extends Fragment { 

    private Cursor cursorAllRows; 
    private RecentCallsTable rcTable; 
    private ListView list; 
    private RecentCallsAdapter adapter; 
    Button btnDelete, btnCreditRequest, btnCreditBlock, btnSendTo; 
    int selectedIndex; //this is the global variable that I am using. 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     rcTable = new RecentCallsTable(getActivity()); 
     cursorAllRows = rcTable.getRecentCallsCursor(); 
     adapter = new RecentCallsAdapter(getActivity(), cursorAllRows); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_main, container, false); 
     list = (ListView) view.findViewById(R.id.listViewMain); 

     btnDelete = (Button) getActivity().findViewById(R.id.buttonDelete); 
     btnCreditRequest = (Button) getActivity().findViewById(R.id.buttonCr); 
     btnCreditBlock = (Button) getActivity().findViewById(R.id.buttonCRD); 

     list.setAdapter(adapter); 
     list.setOnItemClickListener(new ItemClickHandler()); //Add the inner ItemClickLister 

     btnSendTo = (Button) getActivity().findViewById(R.id.buttonSendTo); 
     btnSendTo.setOnClickListener(new DebugOnClick());//here I add the inner clicklister 

     return view; 
    } 

    /** 
    * Class that handles the one click action on the list 
    */ 
    public class ItemClickHandler implements AdapterView.OnItemClickListener{ 

     //when there's one fast click, keep the selection on the item or remove it if already has it 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 
      int prevSelection = adapter.getSelectedIndex(); 
      Toast.makeText(getActivity(), Integer.toString(selectedIndex), Toast.LENGTH_SHORT).show(); 
      int newSelection = position; 
      if(prevSelection == position){ 
       newSelection = -1; 
      } 
      selectedIndex = newSelection; //here I change the value of the global variable 
      adapter.setSelectedIndex(newSelection); 
      adapter.notifyDataSetChanged(); 
     } 
    } 

    public class DebugOnClick implements View.OnClickListener{ 

     public DebugOnClick(){ 
     } 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(getActivity(), Integer.toString(selectedIndex), Toast.LENGTH_SHORT).show(); //here I show the value of the global variable and is always -1 
     } 
    } 
} 

Что может быть проблема?

ответ

0

Я только что нашел проблему. Кнопки находятся в основном режиме, поэтому я просто переместил глобальную переменную в основную активность и начал манипулировать ею из фрагментов следующим образом:

MainActivity ma = (MainActivity) getActivity(); 
ma.rcSelected = newSelection; 
0

Есть одна возможность, которая приходит мне в голову. Когда вы создаете внутренний класс, он неявно связывается с экземпляром класса хостинга (как если бы это была ссылка на класс хостинга). Поэтому я предполагаю, что используемые вами внутренние классы связаны с другим экземпляром размещенного класса и, таким образом, с использованием другого selectedIndex. Ваша глобальная переменная не является глобальной, ее переменной экземпляра.

+0

Так что же может быть решением? Переместить внутренние классы в самостоятельные классы? Я думал об этом, но я не знаю, как это реализовать с слушателями. – tenhsor

+0

Я не вижу никакой проблемы с экстернализацией этих внутренних классов, слушатель не должен быть анонимным или определяться как внутренний класс. При создании прослушивателя вы должны указать ссылку на правильный элемент RecentCallsFragment в конструкторе, который они должны использовать. – Juru

Смежные вопросы