Удалить разделитель между заголовком списка и первым элементом

Из названия моего вопроса моя проблема ясна. У меня есть собственный списокView и заголовок и некоторые элементы. Конечно, я добавил разделители между всеми элементами. Единственное, чего я не хочу, так это разделителя между заголовком и первым элементом. Однако приведенный ниже код не работает. Я также хочу знать точную работу этой строки.

list.setHeaderDividerEnabled(false);

Я много искал и пробовал, также посещал эти ссылки, но не повезло.

Пустое пространство между заголовком списка и первым элементом

Android listView нежелательное пространство между представлением заголовка

Заранее спасибо.

Обновлять!

public class ListView extends android.widget.ListView {

private OnScrollListener onScrollListener;
private Onscroll onscrollObj;

public ListView(Context context) {
    super(context);
    onCreate(context, null, null);
}

public ListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    onCreate(context, attrs, null);
}

public ListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    onCreate(context, attrs, defStyle);
}

@SuppressWarnings("UnusedParameters")
private void onCreate(Context context, AttributeSet attrs, Integer defStyle) {
    setListeners();
}

private void setListeners() {
    super.setOnScrollListener(new OnScrollListener() {

        private int oldTop;
        private int oldFirstVisibleItem;

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if (onScrollListener != null) {
                onScrollListener.onScrollStateChanged(view, scrollState);
            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if (onScrollListener != null) {
                onScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
            }

            if (onscrollObj != null) {
                onDetectedListScroll(view, firstVisibleItem);
            }
        }

        private void onDetectedListScroll(AbsListView absListView, int firstVisibleItem) {
            View view = absListView.getChildAt(0);
            int top = (view == null) ? 0 : view.getTop();

            if (firstVisibleItem == oldFirstVisibleItem) {
                if (top > oldTop) {
                    onscrollObj.onUpScrolling();
                } else if (top < oldTop) {
                    onscrollObj.onDownScrolling();
                }
            } else {
                if (firstVisibleItem < oldFirstVisibleItem) {
                    onscrollObj.onUpScrolling();
                } else {
                    onscrollObj.onDownScrolling();
                }
            }

            oldTop = top;
            oldFirstVisibleItem = firstVisibleItem;
        }
    });
}

@Override
public void setOnScrollListener(OnScrollListener onScrollListener) {
    this.onScrollListener = onScrollListener;
}

public void setOnDetectScrollListener(Onscroll onDetectScrollListener) {
    this.onscrollObj = onDetectScrollListener;
}
}

person Asad    schedule 30.11.2015    source источник
comment
Людям легче помочь вам, если у них есть соответствующий фрагмент кода, над которым нужно работать. Пожалуйста, покажите нам, что вы уже пробовали.   -  person Bö macht Blau    schedule 30.11.2015
comment
Я добавил ссылку, которую уже пробовал, и, пожалуйста, объясните точную работу list.setHeaderDividerEnabled(false);   -  person Asad    schedule 30.11.2015
comment
setHeaderDividersEnabled(boolean) Включает или отключает отрисовку разделителя для заголовков, по крайней мере, это то, что документация говорит. - Я не могу сказать, почему это не работает для вашего приложения, потому что я не вижу ваш код. Что-то вроде минимального, полного и поддающегося проверке примера было бы неплохо.   -  person Bö macht Blau    schedule 30.11.2015
comment
Я использовал этот код для своего listView; я не думаю, что это причина того, что он не работает, так как он также расширяет ListView   -  person Asad    schedule 30.11.2015
comment
можете ли вы добавить решение после того, как узнаете, что является обычай для моего listView @0X0nosugar   -  person Asad    schedule 30.11.2015
comment
Спасибо за публикацию кода. (Я просто хотел убедиться, что в источнике проблемы нет простой опечатки, которая случается со всеми нами) Я только что просмотрел исходный код ListView (grepcode.com). И начал задаваться вопросом: что, если разделители заголовков являются разделителями между двумя или более элементами заголовка? До сих пор я всегда думал: заголовок — это своего рода синглтон. Не могли бы вы попробовать добавить несколько заголовков и поэкспериментировать с включенными/отключенными разделителями?   -  person Bö macht Blau    schedule 30.11.2015
comment
хорошо, я бы провел этот эксперимент, но, попробовав ответ Жли, я понял, что мой пользовательский класс не работает для list.setHeaderDividerEnabled(false); теперь я ищу ответ, что после переопределения этого суперкласса метода я не могу получить ожидаемый результат   -  person Asad    schedule 30.11.2015
comment
1. у вас действительно может быть два или более заголовков, и материал headerDividersEnabled относится к разделителям между ними. - 2. Я не могу протестировать ваш класс, потому что не знаю Onscroll.java - 3. Я думаю, что одним из решений вашей проблемы является отключение любого разделителя, а затем, как и некоторые из указанных ответов. вы можете [в getView() адаптера списка] добавить свою собственную строку 1dp внизу каждой строки списка кроме последней. Какой из них последний? позиция = адаптер.getCount() - 1   -  person Bö macht Blau    schedule 30.11.2015
comment
Извините, у меня нет времени, чтобы опубликовать ответ сейчас, любой может свободно копировать то, что полезно для их ответов, из моих комментариев.   -  person Bö macht Blau    schedule 30.11.2015
comment
Onscroll.java — это не что иное, как простой интерфейс для доступа к методам из фрагмента. хорошо, спасибо за ваши ценные комментарии.   -  person Asad    schedule 30.11.2015


Ответы (4)


Вы можете удалить все разделители с помощью android:dividerHeight="0dp" android:divider="@null" Теперь для каждого элемента списка вы добавляете View с width равным match_parrent и height равным 1dp внизу

person mdtuyen    schedule 30.11.2015
comment
извините, но у вашего решения есть проблема с последним элементом списка, так как оно наконец добавит представление - person Asad; 30.11.2015
comment
Работает отлично! @Md.Asaduzzaman, вы можете просто проверить, является ли это последним элементом списка, и скрыть вид разделителя. - person Mohit Singh; 20.03.2018

Я использую свойство в xml "android:headerDividersEnabled="false"" , и оно отлично работает. И если вы хотите настроить разделитель между заголовком и первым элементом, я полагаю, вы могли бы сделать что-то в нижней части макета заголовка, чтобы притвориться, что это разделитель.

Список с заголовком

Мой код:

Основной.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">


<ListView
    android:headerDividersEnabled="false"
    android:dividerHeight="5dp"
    android:divider="@color/white"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/my_list_view"/>


</RelativeLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >

<ImageView
    android:id="@+id/img"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="3px"
    />
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
    <TextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        />
    <TextView
        android:id="@+id/info"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="10sp"
        />
</LinearLayout>

</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {
@Bind(R.id.my_list_view)
ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    initviews();
}

private void initviews() {
    View view = View.inflate(this,R.layout.headerview,null);
    listView.addHeaderView(view);
    SimpleAdapter adapter = new SimpleAdapter(this, getData(),
            R.layout.list_item, new String[] { "img", "title", "info" },
            new int[] { R.id.img, R.id.title, R.id.info });
    listView.setAdapter(adapter);

}


private List<Map<String, Object>> getData() {
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("img", R.mipmap.ic_launcher);
    map.put("title", "php");
    map.put("info", "for server");
    list.add(map);

    map = new HashMap<String, Object>();
    map.put("img",  R.mipmap.ic_launcher);
    map.put("title", "java");
    map.put("info", "stable");
    list.add(map);

    map = new HashMap<String, Object>();
    map.put("img",  R.mipmap.ic_launcher);
    map.put("title", "C++");
    map.put("info", "cool and hard");
    list.add(map);

    map = new HashMap<String, Object>();
    map.put("img",  R.mipmap.ic_launcher);
    map.put("title", "python");
    map.put("info", "pretty clean");
    list.add(map);

    map = new HashMap<String, Object>();
    map.put("img",  R.mipmap.ic_launcher);
    map.put("title", "hello");
    map.put("info", "every thing");
    list.add(map);

    map = new HashMap<String, Object>();
    map.put("img",  R.mipmap.ic_launcher);
    map.put("title", "world");
    map.put("info", "hello world");
    list.add(map);

    return list;
}

}
person Zhli    schedule 30.11.2015
comment
Единственным существенным отличием от вашего кода является пользовательский класс listView, который я использовал для своего listView. См. обновление выше. - person Asad; 30.11.2015
comment
По-видимому, «android: headerDividersEnabled» — правильный ответ. - person lovefish; 04.07.2016

Этого же можно добиться, используя recyclerView.removeItemDecoration(dividerItemDecoration); .. .. .. Это в основном удаляет любое украшение предмета. (Ребята, вы можете посмотреть украшения предметов, нажав ctrl + щелкните правой кнопкой мыши на ПК на украшениях предметов)

person Utkarsh singh    schedule 19.12.2019
comment
Я думаю, что лучше добавить пример кода в ответ. Чтобы просто сослаться на какую-то ссылку или компонент, я предлагаю добавить его как комментарий вместо ответа. - person Muhammad Umair Shafique; 19.12.2019

person    schedule
comment
и как это поможет УДАЛИТЬ разделитель между заголовком списка и первым элементом? - person Bö macht Blau; 30.11.2015
comment
Вместо того, чтобы настраивать программно, может сработать то же самое в файле xml, просто попробовав help@0X0nosugar. - person HourGlass; 30.11.2015
comment
Я не знаю, поможет ли false. Но правда просто не может быть решением :) - я думаю, что хотел бы видеть больше кода в вопросе, атрибут/метод xml кажется довольно простым, поэтому мне интересно, что нестандартного в списке - person Bö macht Blau; 30.11.2015
comment
увидел правду только после твоего комментария, бро.. :-), @0X0nosugar - person HourGlass; 30.11.2015
comment
Я получил решение от вашего или ответа. Но в первом я не уверен, и можете ли вы объяснить, как это (первое) решит проблему. - person Asad; 30.11.2015
comment
Таким образом, xml устанавливается первым, поэтому лучше установить headerDividerEnabled=false в xml, чем устанавливать его через код Java. Поскольку список обновляется каждый раз, когда вы прокручиваете элемент. Код Java, который вы используете для отключения, стал бесполезным. Поскольку он устанавливается только один раз.. @Md.Asaduzzaman - person HourGlass; 30.11.2015
comment
Конечно, я сначала добавил headerDividerEnabled=false в xml, а затем также попытался добавить с помощью java-кода, но ни один из них не работает - person Asad; 30.11.2015
comment
хорошо, тогда я не уверен, почему первый не работает ... если мой второй работает, отметьте это как ответ. @Md.Asaduzzaman.. - person HourGlass; 30.11.2015