【问题标题】:Android Listview items clickAndroid Listview 项目点击
【发布时间】:2014-07-22 17:37:00
【问题描述】:

我有一个带有自定义 BaseAdapter 的列表视图,它填充来自 json/internet 的列表视图项。

在每个列表视图项中,我都有一个伪按钮(FrameLayouts),并附有点击事件。例如,当单击“MAYBE”时,我会调用服务器并将事件状态更改为“Maybe”。通话成功后,我想将 FrameLayouts 背景更改为适当的颜色(可能为橙色)。

我遇到的困难是参考其他/相邻的 FrameLayouts,以便我可以将它们的背景更改为“中性”。

我所有的事件都在 BaseAdapter 中,我在 GetView 方法中设置了 onClick 事件。

我的问题是:是否有更好的方法/如何为每个 FrameLayout 设置 onclick 事件,以便单击的 FrameLayout 知道其他相邻 FrameLayouts 的单击事件,因此我可以将它们的背景更改为中性并将选定的背景更改为受尊重的颜色。

谢谢。

【问题讨论】:

    标签: android android-listview baseadapter listviewitem


    【解决方案1】:

    您可以使用选择器来操作视图的状态

    1) 创建一个选择器来设置颜色和状态

    <?xml version="1.0" encoding="utf-8"?>
       <selector xmlns:android="http://schemas.android.com/apk/res/android" >
           <item android:drawable="@android:color/black" android:state_selected="false"/>
           <item android:drawable="@android:color/white" android:state_selected="true"/>
       </selector>
    

    2) 在后台设置选择器

    <FrameLayout 
        ...      
           android:clickable="true"
           android:background="@drawable/selector_view">
       </FrameLayout>
    

    3) 在代码部分尝试使用这个

    @Override
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
           view.setSelected(true);
           ...
       }
    

    【讨论】:

    • 这是个好主意,然后我需要为每个 FrameLayout 设置 3 个选择器。谢谢
    【解决方案2】:

    在您的 XML 中将这些属性添加到您的 FrameLayout(Button)

    android:clickable="true"
    android:onClick="onMaybeClick"
    

    然后在您的 baseAdapter getView() 方法中,您可以通过

    找到 FrameLayout
    FrameLayout maybeBtn = (FrameLayout)convertView.findViewById(R.id.list_item_maybe_btn);
    maybeBtn.setTag(4257 + postion);
    

    您还可以在getView() 中设置maybeBtn onClickable,而不是XML,点击监听器也是如此。

    在您的活动中,您可以创建一个onButtonClick(View v) 方法

    public void onMaybeClick(View v)
    {
       int position = (Integer)((FrameLayout)v).getTag() - 4257; //To get the position of the click
    
       LinearLayout parent = (LinearLayout)v.getParent();
    
       FrameLayout btnYes = (FrameLayout)parent.getChildAt(0); //first button
       FrameLayout btnNo = (FrameLayout)parent.getChildAt(2); //second button
    
       ServerCallback(new requestListener(){
           ifSuccess(){
               v.setBackground(...);
           }
       ]);
    }
    

    【讨论】:

    • 是的,我已经通过了TAG中的位置。但是 (View v) 将引用点击的 FrameLayout。我怎样才能掌握相邻的 FrameLayouts,以便我也可以更改它们的背景。谢谢!
    • 哦哦我明白了。但是那我们为什么需要位置呢?让我试试这个,如果可行,我将奖励答案。谢谢!
    • 因为您可能有一个 mArray 包含填充列表的信息,所以您想知道项目的位置,因此您可以例如将 mArray.get(position).getId 作为参数传递给服务器以了解哪个item is clicked Yes/No/Maybe(被点击的物品信息)
    • 正确,但我也在标签中传递了 itemId。谢谢。现在就试试吧。
    【解决方案3】:

    在您的 adapter getView() 方法中执行此操作。所以它将应用于当前在View 上的所有ListView 项目

    // change the row color based on selected position
    if(selectedItem == position){
        layout.setBackgroundColor(Color.WHITE);
    }
    else
    {
        layout.setBackgroundColor(Color.BLACK);
    }
    

    【讨论】:

    • 我不想从服务器重新加载项目。是的,这是从 Internet 刷新数据的最简单方法,并且所有 FrameLayout 都将具有正确的背景。我打算在不刷新的情况下更改背景。
    • 如果您在适配器 getView() 方法中正确实现了 ViewHolder,则不会刷新。
    【解决方案4】:

    为行中的每个项目注册相同的onClickListener()

    onClickListener() 实现到BaseAdapter 类,并在其中放置逻辑,如果单击MAYBE,则循环您的ListView 的每个List&lt;Item&gt; itemList,设置一个布尔值(例如otherSelected ) 将它们中的每一个都设置为 true,然后将 invalidate() ListView 设置为 true,并确保对于 getView() 回调,您处理那些将 otherSelected 设置为 true 的项目,并在返回它们之前更改它们的视图背景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多