Android ResourceCursorAdapter: только один элемент отображается в ListView - PullRequest
0 голосов
/ 08 марта 2020

Я работаю над адаптером, который должен отображать список элементов, полученных из базы данных SQLite. ListView встроен в Fragment, заполнен пользовательским адаптером, подклассами из ResourceCursorAdapter. Перебор курсора и печать его содержимого показывает, что он содержит несколько записей. Однако bindView вызывается только для первой записи, поскольку она отображается только в ListView. Что я делаю не так?

Это (урезанный) код:

Фрагмент XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/network_settings"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:baselineAligned="false">

    <ListView
        android:id="@+id/addresses_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

Элемент списка адаптеров XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/addresses_list_item"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/remote_ip_address"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_weight="0.45"/>

    <TextView
        android:id="@+id/remote_port"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_weight="0.25"/>

    <TextView
        android:id="@+id/address_protocol"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_weight="0.2"/>

    <ImageButton
        android:id="@+id/delete_address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@string/delete_address"
        android:src="@drawable/close"/>

</LinearLayout>

Класс фрагмента (упрощенный, содержит только onCreateView, так как именно здесь создается экземпляр адаптера. Сам фрагмент отлично работает)

public class NetworkSettingsFragment extends Fragment {

    private View mView;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        mView = inflater.inflate(R.layout.network_settings, container, false);

        final SQLiteDatabase db = mActivity.getDatabase();
        final ListView addressesList = mView.findViewById(R.id.addresses_list);

        final String[] addrFields = new String[]{
            SettingsContract.AddressSettingsEntry._ID,
            SettingsContract.AddressSettingsEntry.IP_ADDRESS,
            SettingsContract.AddressSettingsEntry.PORT,
            SettingsContract.AddressSettingsEntry.PROTOCOL
        };
        final String sortOrder = SettingsContract.AddressSettingsEntry.IP_ADDRESS + " DESC";

        final Cursor addressesCursor = db.query(
            SettingsContract.AddressSettingsEntry.TABLE_NAME,
            addrFields,
            null,
            null,
            null,
            null,
            sortOrder
        );

        final AddressesListAdapter addressesListAdapter = new AddressesListAdapter(
            getActivity(), R.layout.address_list_item, addressesCursor, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER
        );
        addressesList.setAdapter(addressesListAdapter);
    }
}

Адаптер

public class AddressesListAdapter extends ResourceCursorAdapter {

    final private static String TAG = "AddressesListAdapter";
    private int mLayout;

    public AddressesListAdapter(Context context, int layout, Cursor c, int flags) {
        super(context, layout, c, flags);
        mLayout = layout;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return LayoutInflater.from(context).inflate(mLayout, parent, false);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        Log.d(TAG, "the view: " + view + "\ncursor: " + cursor.getPosition() + "\nnum items: " + cursor.getCount());

        TextView ipText = view.findViewById(R.id.remote_ip_address);
        TextView portText = view.findViewById(R.id.remote_port);
        TextView protocolText = view.findViewById(R.id.address_protocol);

        final long id = cursor.getLong(cursor.getColumnIndexOrThrow(SettingsContract.AddressSettingsEntry._ID));
        final String ip = cursor.getString(cursor.getColumnIndexOrThrow(SettingsContract.AddressSettingsEntry.IP_ADDRESS));
        final int port = cursor.getInt(cursor.getColumnIndexOrThrow(SettingsContract.AddressSettingsEntry.PORT));
        final String protocol = cursor.getString(cursor.getColumnIndexOrThrow(SettingsContract.AddressSettingsEntry.PROTOCOL));

        ipText.setText(ip);
        portText.setText(String.valueOf(port));
        protocolText.setText(protocol);
    }
}

1 Ответ

0 голосов
/ 21 марта 2020

Чтобы ответить на мой собственный вопрос: это, наконец, оказалось проблемой макета. Что я не учел, так это то, что мои Fragment, в которых мои ListView создаются в ScrollView (который не был частью макета xml, который я разместил в своем вопросе. В этом ScrollView списке из вариантов (ссылки на различные настройки) заменяется моим Fragment, содержащим * 1006. * Однако оригинальный ScrollView не обязательно занимает всю высоту экрана, поэтому мне просто нужно было установить атрибут android:fillViewport до ScrollView XML и установите его на true. Это позволило ListView растянуть до нижней части экрана и элементы, о которых я сначала подумал, что они не были учтены моим адаптером внезапно стал видимым.

Вот упрощенный источник родителя ScrollView (в пределах FrameLayout)

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/settings_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:background="@color/colorDarkTransparentBackground">

    <ScrollView
        android:id="@+id/settings_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingStart="20dp"
        android:paddingLeft="20dp"
        android:paddingTop="5dp"
        android:paddingEnd="20dp"
        android:paddingRight="20dp"
        android:paddingBottom="20dp"
        android:fillViewport="true"
        android:visibility="visible" />

</FrameLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...