Как выбрать просмотр списка Android
Я использовал horizonallistview в Android. и это сработало очень хорошо. и у меня был выбран элемент horizonallistview при нажатии. и это тоже сработало. когда я нажимаю, фон одного элемента был изменен. и это мой исходный код
TextView selectedListItem = null;
String pre_Color = "#6C6C6C";
String select_Color = "#FFFFFF";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listview = (HorizontialListView) findViewById(R.id.listview);
listview.setAdapter(mAdapter);
listview.setOnItemClickListener(new ListViewItemClickListener());
}
private class ListViewItemClickListener implements
AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
mPager.setCurrentItem(position);
if (selectedListItem != null) {
TextView previousTitle = (TextView) selectedListItem
.findViewById(R.id.title);
previousTitle.setBackgroundResource(R.drawable.list_shape);
previousTitle.setTextColor(Color.parseColor(pre_Color));
}
TextView title = (TextView) view.findViewById(R.id.title);
title.setBackgroundResource(R.drawable.list_selected_shape);
title.setTextColor(Color.parseColor(select_Color));
selectedListItem = title;
}
}
но когда я перетаскиваю horizontallistview и обратно снова в той же точке, элемент, который я изменил, нажав, не изменился!!!! это сводит меня с ума.
как эта картина, я выбираю один элемент. и я перетаскиваю некоторые предметы и возвращаюсь снова
затем.....
стало так. нет голубого фона!!!
что я могу сделать, чтобы решить эту проблему.
4 ответа
Эта ошибка связана с тем, что Android сохраняет представление, когда оно было сгенерировано, чтобы повторно использовать его при отображении представления еще раз.
Особенно читайте об аргументе convertView в документации по Adapter:
http://developer.android.com/reference/android/widget/Adapter.html
У вас может быть что-то подобное в getView:
if(convertView != null){
return convertView;
}
Что не очень хороший способ сделать, если вы планируете обновить представление в своем списке. Лучший способ - использовать шаблон ViewHolder, как описано здесь:
Следить за тем, на какой элемент был нажат. Затем в адаптере, в getview, проверьте, совпадает ли позиция элемента с той, по которой щелкнули, если это так, установите для ресурса bg цвет или рисунок, который вы хотите.
Надеюсь, это поможет.
В этом случае я думаю, что вам нужно управлять этим с вашего ArrayAdapter
учебный класс. Там вы должны запомнить последний нажатый вид элемента и положение.
Основная идея onListItemClick
передайте позицию клика и вид элемента адаптеру, там мы установим его цвет, который вам нравится, и изменим последний выбранный цвет, чтобы цвет фона был выбран по умолчанию.
public class SampleAdapter extends ArrayAdapter<Object> {
private int mSelection = 0;
public SampleAdapter(Context context, int resource, int textViewResourceId,
List<Object> objects) {
super(context, resource, textViewResourceId, objects);
}
public void setSelection(int mSelection, View selectedItemView) {
this.mSelection = mSelection;
if (selectedItemView!= null && lastSelectedRow != null
&& selectedItemView!= lastSelectedRow) {
lastSelectedRow
.setBackgroundResource(R.drawable.bg_normal);
selectedItemView
.setBackgroundResource(R.drawable.bg_selected);
}
this.lastSelectedRow = selectedItemView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//Usual code logic here....
if (mSelection == position) {
mViewHolder.mRootView
.setBackgroundResource(R.drawable.bg_selected);
lastSelectedRow = mViewHolder.mRootView;
} else {
mViewHolder.mRootView
.setBackgroundResource(R.drawable.bg_normal);
}
return view;
}
private static class ViewHolder {
TextView name;
View mRootView;
}
}
При нажатии элемента списка необходимо передать выбранный элемент и положение в адаптер.
public void onItemClick(AdapterView<?> arg0, View listItemView,
int position, long id) {
if(myAdapter != null )
{
myAdapter.setSelection(position,listItemView);
}
}
если вы хотите вызвать этот выбор набора из другой точки, вы можете назвать его следующим образом.
myAdapter.setSelection(position,mListViwe.getChildAt(pos));
mListViwe.setSelectionFromTop(position, 0);
Это происходит из-за повторного использования представления списка, я бы сделал настраиваемое рисование, чтобы оно отображалось как выбранное при проверке, а затем в вызове по элементу.
listview.setItemChecked(position, true);
вам нужно будет обработать для сброса других предметов, как не проверено и т. д.