OK. У меня есть ответ сейчас. Проблема в том, что .setSelectionFromTop () будет работать только в том случае, если представление списка было в верхнем макете (то есть не вложено). После некоторого расчесывания головы я понял, что могу сделать свой макет RelativeLayout и получить тот же внешний вид, но без необходимости вложения макетов для флажка и списка. Это новый макет:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recordViewLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<CheckBox android:id="@+id/checkBoxTop"
android:text="Check All"
android:layout_width="160dp"
android:layout_height="wrap_content"/>"
<ListView android:id="@+id/engNameList"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:layout_below="@+id/checkBoxTop"/>
<HorizontalScrollView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/checkBoxTop">
<LinearLayout android:id="@+id/scroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/record_view_line" android:id="@+id/titleLine" />
<ListView
android:id="@android:id/list"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>
</LinearLayout>
</HorizontalScrollView>
</RelativeLayout>
Это в основном код, который идет с макетом.
В onCreate ()
engListView=getListView();
engListView.setOnTouchListener(this);
recordListView=(ListView)findViewById(R.id.recordList);
recordListView.setOnScrollListener(this);
и методах прослушивания:
public boolean onTouch(View arg0, MotionEvent event) {
recordListView.dispatchTouchEvent(event);
return false;
}
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
View v=view.getChildAt(0);
if(v != null)
engListView.setSelectionFromTop(firstVisibleItem, v.getTop());
}
Любая непустая строка оценивается как истинная, а пустая строка оценивается как ложная. Следующий сценарий может пролить свет на вас:
<?php
if('true' == true) {
echo "'true' == true";
} else {
echo "'true' != true";
}
echo '<br />';
if('false' == true) {
echo "'false' == true";
} else {
echo "'false' != true";
}
echo '<br />';
if('foo' == true) {
echo "'foo' == true";
} else {
echo "'foo' != true";
}
echo '<br />';
if('false' == false) {
echo "'false' == false";
} else {
echo "'false' != false";
}
echo '<br />';
if('' == true) {
echo "'' == true";
} else {
echo "'' != true";
}
echo '<br />';
if('' == false) {
echo "'' == false";
} else {
echo "'' != false";
}
?>
Вот результат:
'true' == true
'false' == true
'foo' == true
'false' != false
'' != true
'' == false
По запросу, вот еще несколько примеров сравнения == с === для различных значений.
<?php
echo "<b>'true' vs. true</b><br />";
if('true' == true) {
echo "'true' == true<br />";
} else {
echo "'true' != true<br />";
}
if('true' === true) {
echo "'true' === true<br />";
} else {
echo "'true' !== true<br />";
}
echo "<br /><b>'false' vs. true</b><br />";
if('false' == true) {
echo "'false' == true<br />";
} else {
echo "'false' != true<br />";
}
if('false' === true) {
echo "'false' === true<br />";
} else {
echo "'false' !== true<br />";
}
echo "<br /><b>1 vs. true</b><br />";
if(1 == true) {
echo "1 == true<br />";
} else {
echo "1 != true<br />";
}
if(1 === true) {
echo "1 === true<br />";
} else {
echo "1 !== true<br />";
}
echo "<br /><b>0 vs. false</b><br />";
if(0 == false) {
echo "0 == false<br />";
} else {
echo "0 != false<br />";
}
if(0 === false) {
echo "0 === false<br />";
} else {
echo "0 !== false<br />";
}
echo "<br /><b>1 vs. 'true'</b><br />";
if(1 == 'true') {
echo "1 == 'true'<br />";
} else {
echo "1 != 'true'<br />";
}
if(1 === 'true') {
echo "1 === 'true'<br />";
} else {
echo "1 !== 'true'<br />";
}
echo "<br /><b>empty string '' vs. false</b><br />";
if('' == false) {
echo "'' == false<br />";
} else {
echo "'' != false<br />";
}
if('' === true) {
echo "'' === false<br />";
} else {
echo "'' !== false<br />";
}
?>
Вывод:
'true 'vs. истина
'true' == true
'true' !== true
' false 'vs. true
'false' == true
'false' !== true
1 vs. true
1 == true
1 !== true
0 vs. false
0 == false
0 !== false
1 vs.' true '
1 != 'true'
1 !== 'true'
пустая строка' 'vs. false
'' == false
'' !== false
Я всегда стараюсь использовать более строгие ===
или ! ==
, когда мне абсолютно необходим логический ответ, поэтому:
$success = 'true';
if( $success === 'false'){
...
}
На всякий случай.
Сначала логическое значение. 2-я строка
Вы можете увидеть их различие в этом.
$success = 'true';
$success2 = true;
var_dump($success);
var_dump($success2);
А также проверьте результат этого
var_dump($success == $success2);
var_dump($success === $success2);
Вам также следует изучить эту таблицу сравнения типов. Настоящая полезная информация, которая поможет вам немного лучше понять PHP.
Да, разница есть. Каждое значение переменной PHP (или почти любого языка программирования) имеет «тип». При создании / присвоении значения в кавычках
$foo = 'true';
вы создаете значение, тип которого является строкой, а при создании / присвоении значения без кавычек вы создаете переменную с логическим типом
$bar = true;
Как и некоторые другие современные, В динамических языках PHP очень старается организовать вещи таким образом, чтобы вам не приходилось беспокоиться о таких вещах, как тип. Например, многие языки НЕ позволяют сравнивать равенство двух переменных, если они не одного типа, поэтому что-то вроде
if('true' == True) ...
не является допустимым кодом в python (вы получите исключение). PHP, с другой стороны, старается быть хорошим и (за кулисами) говорит: «Что ж, если вы используете любую строку в операции равенства, мы» пытаясь упростить общий случай (давайте преобразуем переменные для людей), они усложнили некоторые менее распространенные случаи, что может привести к тому, что баги будет сложно отслеживать. Все становится по-настоящему ужасно, когда одни люди в вашей команде понимают закулисное принуждение, а другие - нет.
Итак, по большому счету, всегда лучше возвращать явные логические значения (без кавычек) из методов и функций, возвращающих успех. Опытные программисты ожидают этого, а неопытные программисты будут сбиты с толку некоторыми ошибками, которые всплывают, когда вместо них используются строки.
по большому счету, всегда лучше возвращать явные логические значения (без кавычек) из методов и функций, возвращающих успех. Опытные программисты ожидают этого, а неопытные программисты будут сбиты с толку некоторыми ошибками, которые всплывают, когда вместо них используются строки. по большому счету, всегда лучше возвращать явные логические значения (без кавычек) из методов и функций, возвращающих успех. Опытные программисты ожидают этого, а неопытные программисты будут сбиты с толку некоторыми ошибками, которые всплывают, когда вместо них используются строки.