ListViewItem 灰显

Posted

技术标签:

【中文标题】ListViewItem 灰显【英文标题】:ListViewItem is grayed out 【发布时间】:2021-07-29 15:08:30 【问题描述】:

我目前正在用 android 编写一个应用程序。在这个应用程序中,我有一个 ListActivity,里面有一个 ListView。我希望这个 ListView 有自定义项目,所以我编写了一个自定义 BaseAdapter 来指定我的项目。到目前为止效果很好。 这是 ListActivity 的 XML 代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:descendantFocusability="blocksDescendants"
    android:layout_
    android:layout_
    tools:context=".PalettenActivity" >

    <ListView
        android:id="@+id/listViewPaletten"
        android:layout_
        android:layout_
        android:entries="@layout/paletten_item"
        android:minHeight="?android:attr/listPreferredItemHeight" >
    </ListView>

</RelativeLayout>

我还为该项目编写了一个 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layoutPalettenItem"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:layout_
    android:layout_
    android:padding="10dp"
    tools:context=".PalettenAdapter" >
    
    <TextView
        android:id="@+id/textViewPalettenBez"
        android:layout_
        android:layout_
        android:layout_alignParentLeft="true"
        android:gravity="left|center_vertical"
        android:text="Bezeichnung"
        android:textSize="25sp" />

    <Button
        android:id="@+id/buttonPalettenPlus"
        android:layout_
        android:layout_
        android:layout_alignParentRight="true"
        android:text="+"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/textViewPalettenAnzahl"
        android:layout_
        android:layout_
        android:layout_alignBaseline="@+id/buttonPalettenPlus"
        android:layout_alignBottom="@+id/buttonPalettenPlus"
        android:layout_toLeftOf="@+id/buttonPalettenPlus"
        android:gravity="center"
        android:text="0"
        android:textSize="20sp" />

    <Button
        android:id="@+id/buttonPalettenMinus"
        android:layout_
        android:layout_
        android:layout_alignBaseline="@+id/textViewPalettenAnzahl"
        android:layout_alignBottom="@+id/textViewPalettenAnzahl"
        android:layout_toLeftOf="@+id/textViewPalettenAnzahl"
        android:text="-"
        android:textSize="20sp" />

</RelativeLayout>

现在我面临的问题是 ListItem 在 ListView 中显示为灰色,因此我无法按下任何按钮。 如您所见,我在项目上尝试了android:focusable="false"android:focusableInTouchMode="false",在ListView 上尝试了android:descendantFocusability="blocksDescendants"。但什么都没有改变。

这是它的外观: 如您所见,底部的按钮看起来很正常,但该项目的所有视图都是灰色的。

这是我的 ListActivity 的 onCreate() 代码:

super.onCreate(savedInstanceState);
dataSource = new DataSource(this);

int id_lieferschein = getID_Lieferschein();
if (id_lieferschein > 0) 
  paletten = ladePaletten(id_lieferschein);
  /*"ladePaletten()" extracts data form a SQLite-DB and stores it into a 
  ArrayList called "paletten". */
  if (paletten != null && paletten.size() > 0) 
    adapter = new PalettenAdapter(this, paletten);  // my BaseAdapter
    listViewPaletten = getListView();
    listViewPaletten.setAdapter(adapter);
    listViewPaletten.setEnabled(true);
  

这是我的 BaseAdapter 的 getView():

try 
    LayoutInflater itemInflater =(LayoutInflater)parent.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
/* "parent" is my ListActivity. It`s a private variable of my BaseAdapter. I hand it over in the constructor of this class */
            if (convertView == null) 
                convertView = itemInflater.inflate(R.layout.paletten_item, null);   
            
            convertView.setMinimumHeight(120);
            convertView.setEnabled(true);
            
            ladePalette(convertView, paletten.get(position), position); 
            /* in "ladePaletten()" i attach some onClickListeners to some 
            buttons of the ListView-Item. */
         catch (Exception e) 
            Log.e(TAG, e.getMessage());
            e.printStackTrace();
        
return convertView;

如果有人可以帮助我解决这个问题,我会很高兴。 . 谢谢你的帮助! 莫里斯 F.

【问题讨论】:

请添加 listactivity 和 baseAdapter 的代码。 就这么做了。如果您需要更多信息,请告诉我 【参考方案1】:

在您的 XML 文件中,您编写了 entry 属性。因此,请删除它,因为您正在通过适配器和 xml 添加值(顺便说一下,您正在添加布局而不是数组)。因此两者都是冲突的,您不需要在 Listview 中写入 xml。

而不是,

<ListView
    android:id="@+id/listViewPaletten"
    android:layout_
    android:layout_
    android:entries="@layout/paletten_item"
    android:minHeight="?android:attr/listPreferredItemHeight" >
</ListView>

致,

<ListView
    android:id="@+id/listViewPaletten"
    android:layout_
    android:layout_
    android:minHeight="?android:attr/listPreferredItemHeight" >
</ListView>

另外,我附上了自定义列表视图的示例。

1) activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_
     android:layout_
     android:background="#FF9D9D"
     tools:context=".MainActivity">

<ListView
     android:id="@+id/listViewPaletten"
     android:layout_
     android:layout_
     android:minHeight="?android:attr/listPreferredItemHeight" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

2) Paletten_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layoutPalettenItem"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_
android:layout_
android:padding="10dp">

<TextView
    android:id="@+id/textViewPalettenBez"
    android:layout_
    android:layout_
    android:layout_alignParentLeft="true"
    android:gravity="left|center_vertical"
    android:text="Bezeichnung"
    android:textSize="25sp" />

<Button
    android:id="@+id/buttonPalettenPlus"
    android:layout_
    android:layout_
    android:layout_alignParentRight="true"
    android:text="+"
    android:textSize="20sp" />

<TextView
    android:id="@+id/textViewPalettenAnzahl"
    android:layout_
    android:layout_
    android:layout_alignBaseline="@+id/buttonPalettenPlus"
    android:layout_alignBottom="@+id/buttonPalettenPlus"
    android:layout_toLeftOf="@+id/buttonPalettenPlus"
    android:gravity="center"
    android:text="0"
    android:textSize="20sp" />

<Button
    android:id="@+id/buttonPalettenMinus"
    android:layout_
    android:layout_
    android:layout_alignBaseline="@+id/textViewPalettenAnzahl"
    android:layout_alignBottom="@+id/textViewPalettenAnzahl"
    android:layout_toLeftOf="@+id/textViewPalettenAnzahl"
    android:text="-"
    android:textSize="20sp" />

</RelativeLayout>

3) MainActivity.java

public class MainActivity extends AppCompatActivity 

ListView listView;

private String[] names =
        "Item1",
        "Item2",
        "Item3",
        "Item4",
        "Item5"
;
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = findViewById(R.id.listViewPaletten);
    listView.setAdapter(new ListviewAdapter(names,getApplicationContext()));



4) ListviewAdapter.java

public class ListviewAdapter extends BaseAdapter 

private String[] names;
Context context;

public ListviewAdapter(String[] names, Context context) 
    this.names = names;
    this.context = context;


@Override
public int getCount() 
    return names.length;


@Override
public Object getItem(int position) 
    return null;


@Override
public long getItemId(int position) 
    return 0;


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    if (convertView == null)
        convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.paletten_item,parent,false);

        TextView tv_names = convertView.findViewById(R.id.textViewPalettenBez);
        tv_names.setText(names[position]);
    
    return convertView;


【讨论】:

感谢您的详细解答!我的 MainActivity 现在扩展了 Activity 而不再是 ListActivity,我已经从我的 XML 中删除了 android:entries="@layout/paletten_item",我在 my onCreate() 中删除了 setContentView(R.layout.activity_paletten);adapter = new PalettenAdapter(this, paletten); // paletten is a ArrayList listViewPaletten = (ListView)findViewById(R.id.listViewPaletten); listViewPaletten.setAdapter(adapter); listViewPaletten.setEnabled(true); 但没有任何变化。所有的项目都是灰色的。

以上是关于ListViewItem 灰显的主要内容,如果未能解决你的问题,请参考以下文章

从 ListView 获取 ListViewItem 而不是 Item

禁用UWP ListView控件的ListViewItem显示效果

当 ListView 有 ItemTemplate 时如何处理 ListViewItem 的右键单击?

滚动ListViewItem位于ListView的顶部

ListView

wpf 将Style应用到 ListView 中的 ListViewItem 元素