ListView - изменение цвета разделителя только для первого элемента

1

Так что на самом деле у меня есть MapActivity и ListActivity на одном экране, когда пользователь нажимает на один из Pin на карте, щелкнутое местоположение будет в верхней части списка и имеет другой фон и цвет разделителя.

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

Мне удалось создать первую запись в ListView, чтобы иметь определенный фон, но когда я просматриваю список, некоторые фон других записей также меняются.

Вот мой метод:

double selectedLat = WWHApplication.getSelectedLatitude();
            DecimalFormat df = new DecimalFormat("#.#####");

            String dLat = df.format(lat);
            String sLat = df.format(selectedLat);
            if (position == 0) {
                if (dLat.equals(sLat)) {
                    feedViewHolder.layout
                            .setBackgroundResource(R.drawable.list_segment_selected);

                }
            }

Как изменить цвет разделителя и фон ListView только на первом элементе? Я очень признателен, если кто-то может мне помочь в этом случае, я также открываю любые другие решения. Спасибо.

ОБНОВЛЕНО: здесь метод getView()

@Override
        public View getView(final int position, View convertView,
                ViewGroup parent) {
            layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            FeedViewHolder feedViewHolder = null;
            final VideoLocationDB vidLocation = videoLocationsDB[position];
            String url = vidLocation.documentary_thumbnail_url;
            String name = vidLocation.name;
            String title = vidLocation.name;
            String desc = vidLocation.text;
            double lat = vidLocation.latitude;
            double lng = vidLocation.longitude;
            String distance = calculateDistance(lat, lng);

            // System.out.println("ON LOC DISTANCE: "+distance);
            if (convertView == null) {

                // convertView = LocationsListActivity.this.getLayoutInflater()
                // .inflate(R.layout.listitems, null, true);
                convertView = layoutInflater.inflate(R.layout.listitems,
                        parent, false);
                feedViewHolder = new FeedViewHolder();
                feedViewHolder.layout = (LinearLayout) convertView
                        .findViewById(R.id.list_bg);
                feedViewHolder.titleView = (TextView) convertView
                        .findViewById(R.id.txt_title);
                feedViewHolder.descView = (TextView) convertView
                        .findViewById(R.id.txt_list_desc);
                feedViewHolder.more = (TextView) convertView
                        .findViewById(R.id.txt_more);
                feedViewHolder.distanceView = (TextView) convertView
                        .findViewById(R.id.txt_distance);
                feedViewHolder.v = (ImageView) convertView
                        .findViewById(R.id.image);

                Typeface fontRegular = Typeface.createFromAsset(getAssets(),
                        "miso.otf");
                feedViewHolder.titleView.setTypeface(fontRegular);
                Typeface fontLight = Typeface.createFromAsset(getAssets(),
                        "miso-light.otf");
                feedViewHolder.descView.setTypeface(fontLight);
                feedViewHolder.more.setTypeface(fontLight);
                feedViewHolder.distanceView.setTypeface(fontRegular);

                convertView.setTag(feedViewHolder);

            } else {
                feedViewHolder = (FeedViewHolder) convertView.getTag();
            }

            feedViewHolder.v.setTag(url);
            loader.DisplayImage(url, LocationsListActivity.this,
                    feedViewHolder.v, name);

            double selectedLat = WWHApplication.getSelectedLatitude();
            DecimalFormat df = new DecimalFormat("#.#####");

            String dLat = df.format(lat);
            String sLat = df.format(selectedLat);
            if (position == 0) {
                if (dLat.equals(sLat)) {
                    feedViewHolder.layout
                            .setBackgroundResource(R.drawable.list_segment_selected);
                }
            }

            feedViewHolder.titleView.setText(title.toUpperCase());
            feedViewHolder.descView.setText(desc);
            feedViewHolder.more.setText(getString(R.string.de_list_more));
            feedViewHolder.distanceView.setText(distance);

            return convertView;
        }
Теги:

1 ответ

1
Лучший ответ

Я не думаю, что список ListView поддерживает это поведение.

Вы можете подделать его, установив разделители в ListView равным 0 и добавляя в разделители себя как "простые" строки. Поскольку вы можете сделать строку похожей на все, что захотите, возможно, вы можете раздуть представление, которое выглядит как любой вид делителя, который вы хотите, и добавить его в список между каждым элементом. Должна быть возможность реализовать эту логику в методе getView() адаптера.

РЕДАКТИРОВАТЬ:

Я думаю, что он должен исправить, если вы добавите блок else, если вы меняете цвет следующим образом:

if (position == 0) {
    if (dLat.equals(sLat)) {
        feedViewHolder.layout.setBackgroundResource(R.drawable.list_segment_selected);
    }
}else{
    feedViewHolder.layout.setBackgroundResource(android.R.drawable.list_selector_background);

}

и замените "list_normal" на то, что вы делаете по умолчанию. Если вы не задали один, возможно, вам нужно что-то вроде android.R.drawable.list_selector_background Возможно, вам придется искать в папке sdk res drawable, чтобы найти правильное имя, я мог ошибаться в его точном заголовке. Я проверил, и я думаю, что это тот, который вам нужен. Но я не тестировал его на устройстве.

  • 0
    хорошо, я понимаю, но правильно ли моя логика в моем методе выше, что изменение происходит только в первой записи списка? Потому что первый элемент был изменен, но когда я прокручивал список, некоторые записи тоже меняли свой фон. Как это могло случиться?
  • 0
    Да, это из-за переработки адаптера с convertView. Вставьте метод getView () ваших адаптеров, и я могу помочь вам исправить это. По сути, это повторное использование этого другого цветового представления для добавления нового содержимого при прокрутке списка вниз. Вам просто нужно убедиться, что он вернул фон в нормальное состояние для представлений, отличных от позиции 0.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню