Фрагмент ListView Inflation для поддержания выбора onItemClick не работает
У меня есть ListView
это внутри фрагмента. в onCreateView
раздел я установил onItemClickListener
для списка, который выделяет выбранный элемент в ListView
, Я поставил два ImageButtons
которые перемещаются вверх и вниз по списку. На подбор нового Row
надувается (R.layout.selected_row
) это имеет свое TextView
устанавливается на содержимое выбранного элемента (с целью сохранения выделенного выбранного состояния). К сожалению, при нажатии на элемент и / или нажав на ImageButton
кажется, что ничего не завышено (и никаких заметных изменений в списке не происходит). Я считаю, что это может быть связано с адаптером SelectedAdapter
конструкция, ИП:
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
ценность для нового Row
, Не уверен, что это вкладчик.
1 ответ
Я постараюсь решить вашу проблему с тем, что кнопки ImageButtons не активируются. Мне никогда не нравилось иметь так много GUI-кода в onCreateView
(), Я предлагаю переместить некоторый код в onViewCreated
метод. onViewCreated происходит после onCreateView. Я считаю, что проблема заключается в том, когда структура может или не может установить точку зрения надежно. Видимо использование onViewCreated более надежно.
Мой пример кода:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.routines,
container, false);
...
}
Итак, вы можете видеть, что мой onCreateView
просто устанавливает основной вид. Несколько раз это решало проблему для других пользователей SO.