我正在尝试使用onClickListener为子LinearLayout中存在的TextView切换子LinearLayout的可见性。有人可以帮助我实现这个目标吗?
以下是我的布局文件的一部分:
<LinearLayout android:id="@+id/main_space"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="10"
android:padding="2dp">
<TextView android:id="@+id/currentUserHeader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/currentuserheader_textsize"
android:textColor="@color/currentuserheader_textcolor"/>
<TextView android:id="@+id/currentUserBody"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/currentuserbody_textsize"
android:textColor="@color/currentuserbody_textcolor"
android:clickable="true"
android:onClick="toggleUserActionBar"/>
<LinearLayout android:id="@+id/useractions"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone"
android:background="@color/useractions_background">
<TextView android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Save"
android:textColor="@color/useractions_label"
android:textSize="@dimen/useractions_textsize"
android:layout_weight="1"
android:gravity="center"/>
<TextView android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Delete"
android:textColor="@color/useractions_label"
android:textSize="@dimen/useractions_textsize"
android:layout_weight="1"
android:gravity="center"/>
<TextView android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Forward"
android:textColor="@color/useractions_label"
android:textSize="@dimen/useractions_textsize"
android:layout_weight="1"
android:gravity="center"/>
</LinearLayout>
</LinearLayout>
当我点击TextView“currentUserBody”时,我想切换正好在该文本视图下的LinearLayout“useractions”的可见性。
此布局实际上是ListView中行的布局。所以我希望这个功能适用于该ListView中的每一行。用户只需点击文本,就可以在文本下方打开选项,以便快速执行这些操作。
你能帮助我实现这个目标吗?
PS:我创建了一个自定义ArrayAdapter来填充ListView。
答案 0 :(得分:2)
快速而肮脏的解决方案可能是:
public void toggleUserActionBar(View v) {
View actions = v.getParent().findViewById(R.id.useractions);
if(actions.getVisibility() == View.VISIBLE) {
actions.setVisibility(View.GONE);
} else {
actions.setVisibility(View.VISIBLE);
}
}
更清洁的解决方案是在自定义视图中对项目布局进行充气,可以自行处理所有这些内容。
答案 1 :(得分:2)
以下是执行所需操作的getView
方法的示例:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// do the normal thing you would do, inflate stuff, use the view holder pattern etc
// set as the tag for the clickable TextView the current position
((TextView) convertView.findViewById(R.id.currentUserBody)).setTag(Integer.valueOf(position));
// set the listener for the TextView
((TextView) convertView.findViewById(R.id.currentUserBody)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// retrieve the position value
Integer realPos = (Integer) v.getTag();
// get the parent and then search for the useractions LinearLayout
View hiddingLayout = ((LinearLayout) v.getParent()).findViewById(R.id.useractions);
// modify a status holder with the new value
status[realPos] = !status[realPos];
// change the visibility
hiddingLayout.setVisibility(status[realPos] ? View.VISIBLE : View.GONE);
}
});
// this is required so we don't mess up the rows with visible/gone layouts
convertView.findViewById(R.id.useractions).setVisibility(status[position] ? View.VISIBLE : View.GONE);
return convertView;
}
status
数组是boolean
数组,用于保存每行的可见性状态(false
值表示GONE
,否则为VISIBLE
。您可以根据数据大小在构造函数中创建此数组。如果您打算在适配器上调用notifyDataSetChanged
,则需要重置阵列。
编辑:
另一种选择是将当前布局文件分成两部分并使用隐藏布局为子视图的ExpandableListView
。