Как выбрать просмотр списка 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, как описано здесь:

http://www.jmanzano.es/blog/?p=166

Следить за тем, на какой элемент был нажат. Затем в адаптере, в 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);

вам нужно будет обработать для сброса других предметов, как не проверено и т. д.

Другие вопросы по тегам