【问题标题】:Trouble with ListView列表视图的问题
【发布时间】:2018-11-02 23:22:25
【问题描述】:

我的 Main Activity 和 ListView 有问题,我完全不明白它是如何工作的......

好的!这就是我想要的:

期待

这意味着我需要一个项目列表:TextViews

在这个列表之外还有一个简单的按钮。我不希望按钮成为列表的一部分。

但这就是我所拥有的:

现实

如您所见,在我列表的每个子项中,我都有我的文本和我的按钮:为什么?

我的代码主要:

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>

如果有人可以向我解释如何解决我的问题(以及最终如何解决),我将不胜感激!

非常感谢:)

【问题讨论】:

    标签: android xml list button view


    【解决方案1】:

    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);
    

    【讨论】:

    • 谢谢!我终于明白它是如何工作的了! :) 我喜欢你使用几个 XML 的方法!
    • 快乐编码。用 RecyclerView 代替 listView 更好。阅读有关差异的文章。
    • 好的,我会调查的,再次感谢
    【解决方案2】:

    在您的适配器的 getView() 方法中,您必须设计一个 child_view 布局。您返回的布局将显示在列表的每个项目中。因为您要返回 main_activity_layout,所以您的每个项目都会显示 mainAcitivy,其中包含一个按钮。解决方案是使用您自己的设计创建新布局,并将其替换为 R.layout.main_acitivity_layout。祝你好运

    【讨论】:

      【解决方案3】:

      您不应该在 getView 中使用 R.layout.activity_main_menu,因为 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));
      

      【讨论】:

      • 感谢您的评论!我现在明白它是如何工作的。即使你的方法有效,我更喜欢 Momen Zaqout 一种:) 再次感谢
      猜你喜欢
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      相关资源
      最近更新 更多