Проблема с ListView - PullRequest
       3

Проблема с ListView

0 голосов
/ 03 ноября 2018

У меня проблема с моей основной активностью и ListView, и я абсолютно не понимаю, как это работает ...

ОК! Вот что я хочу:

Expectation

Expectation display

Это означает, что мне нужен список элементов: TextViews

И ВНЕ этого списка простая кнопка. Я не хочу, чтобы кнопка была частью списка.

Но вот что у меня есть:

Reality

Reality display

Как вы можете видеть, у каждого ребенка в моем списке есть мой текст И моя кнопка: Почему ??

Мой код Main:

public class MainMenu extends AppCompatActivity implements IRemDeck, IRemCard {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_menu);

    ListView listView = findViewById(R.id.MainDecksList);
    AdapterDeck adpDeck;
    ArrayList<Deck> myDecks = new ArrayList<>();
    for (int i = 0; i<5;i++){
        myDecks.add(new Deck("Deck " + i));
    }

    adpDeck = new AdapterDeck(this, 0, myDecks);
    listView.setAdapter(adpDeck);

}

Мой адаптер (для ListView):

public AdapterDeck(@NonNull Context context, int resource, @NonNull ArrayList<Deck> decks) {
    super(context, resource, decks);
    this.decks = decks;
    this.context = context;
}


@Override
public int getCount() {
    return decks.size();
}

@Override
public Deck getItem(int pos) {
    return decks.get(pos);
}

@Override
public long getItemId(int pos) {
    return 0;
    //just return 0 if your list items do not have an Id variable.
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.activity_main_menu, null);
    }

    //Handle TextView and display string from your list
    TextView listItemText = view.findViewById(R.id.MainDeckNom);
    listItemText.setText(decks.get(position).getNom());


    return view;
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.MainMenu">

<TextView
    android:id="@+id/MainDeckNom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<ListView
    android:id="@+id/MainDecksList"
    android:layout_width="363dp"
    android:layout_height="426dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:text="Button"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/MainDecksList" />

</android.support.constraint.ConstraintLayout>

Если бы кто-то мог объяснить мне, как решить мою проблему (и как она в конечном итоге работает), я был бы очень благодарен!

Большое спасибо :)

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018

listview должен иметь свой собственный макет, поэтому вам нужно создать новый макет, который просто содержит listview и в методе getView() использовать его как строку вашего listView

1 - создать новый row_listview.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.MainMenu">

<TextView
    android:id="@+id/MainDeckNom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />



</android.support.constraint.ConstraintLayout>

2-Изменить эту строку

    view = inflater.inflate(R.layout.activity_main_menu, null);

до

    view = inflater.inflate(R.layout.row_listview, null);
0 голосов
/ 03 ноября 2018

Вы не должны использовать R.layout.activity_main_menu в getView, потому что getView возвращает строку списка, для которой у вас нет кнопки.

Итак, у вас есть отдельный макет activity_main_men, указанный как представление контента для действия, у которого нет TextView:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.MainMenu">

<ListView
    android:id="@+id/MainDecksList"
    android:layout_width="363dp"
    android:layout_height="426dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:text="Button"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/MainDecksList" />

</android.support.constraint.ConstraintLayout>

В getView вместо

view = inflater.inflate (R.layout.activity_main_menu, null);

Вы просто разместите:

view = new TextView()
view.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
0 голосов
/ 03 ноября 2018

В методе getView () вашего адаптера вы должны разработать макет child_view. Макет, который вы вернете, будет показан в каждом элементе списка. Потому что вы возвращаете main_activity_layout, чтобы каждый ваш элемент отображал mainAcitivy, который содержит кнопку. Решение - создать новый макет с вашим собственным дизайном и заменить его на R.layout.main_acitivity_layout. Удачи

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