我有一个listview,其中包含一个自定义BaseAdapter,用于填充json / internet中的listview项目。
在每个listview项目中,我都有一个伪按钮(FrameLayouts),附带有点击事件。单击“MAYBE”时,我会调用服务器并将事件状态更改为“Maybe”。呼叫回来后成功,我想将FrameLayouts背景更改为适当的颜色(Orange for Maybe)。
我遇到困难的地方是引用其他/相邻的FrameLayouts,这样我就可以将其背景改为“中立”。
我的所有事件都在BaseAdapter中,我在GetView方法中设置onClick事件。
我的问题是:是否有更好的方法/如何为每个FrameLayout设置onclick事件,因此单击的FrameLayout知道其他相邻FrameLayouts的click事件,因此我可以将其背景更改为中性并将所选背景更改为受尊重的颜色。
感谢。
答案 0 :(得分: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);
...
}
答案 1 :(得分:0)
在adapter
getView()
方法中执行此操作。因此,它将应用于当前ListView
View
项目
// change the row color based on selected position
if(selectedItem == position){
layout.setBackgroundColor(Color.WHITE);
}
else
{
layout.setBackgroundColor(Color.BLACK);
}
答案 2 :(得分:0)
为行中的每个项目注册相同的onClickListener()
。
将onClickListener()
实施到BaseAdapter
类,并在其中放置逻辑,如果单击MAYBE,则循环List<Item> itemList
的每个ListView
,设置一个布尔值(例如otherSelected
)对于每个布尔值为真,然后invalidate()
为ListView
,并确保getView()
回调您使用{处理这些项目{1}}设置为true,并在返回之前更改其视图背景。
答案 3 :(得分:0)
将theese属性添加到你的FrameLayout(按钮)
android:clickable="true"
android:onClick="onMaybeClick"
然后在baseAdapter getView()
方法中找到FrameLayout by
FrameLayout maybeBtn = (FrameLayout)convertView.findViewById(R.id.list_item_maybe_btn);
maybeBtn.setTag(4257 + postion);
您也可以在maybeBtn
而不是XML中设置getView()
onClickable,clicklistener也是如此。
在您的活动中,您可以创建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(...);
}
]);
}