У меня есть фрагмент андроида, который имеет 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
}
}
}
Что может быть проблема?
Так что же может быть решением? Переместить внутренние классы в самостоятельные классы? Я думал об этом, но я не знаю, как это реализовать с слушателями. – tenhsor
Я не вижу никакой проблемы с экстернализацией этих внутренних классов, слушатель не должен быть анонимным или определяться как внутренний класс. При создании прослушивателя вы должны указать ссылку на правильный элемент RecentCallsFragment в конструкторе, который они должны использовать. – Juru