【发布时间】:2021-12-11 10:53:11
【问题描述】:
我的问题: 在我的 xml 文件中,我在标记为assess_layout_list 的线性布局中定义了android:visibility="gone"。然后,在 course_adapter_layout 的 onClick() 整个视图中,我将可见性设置回 View.VISIBLE,这不起作用,即使在它工作之前的 Log 调用,名为assess_list_layout 的 LinearLayout 对象也不为空,并且它当我在 xml 文件中定义 visibility="invisible" 时确实有效。不过我希望它一开始就消失,点击后可见,因为这符合应用程序的设计。
这是我的 course_adapter_view.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/course_adapter_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="left"
>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
android:layout_marginTop="20dp"
android:padding="15dp"
android:elevation="2dp"
android:background="@drawable/course_header_background">
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/course_color_circle"/>
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.25"/>
<TextView
android:id="@+id/course_adapter_course_code"
android:text="TextView1"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_weight="0.5"/>
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.25"/>
<TextView
android:id="@+id/course_adapter_course_title"
android:text="TextView2"
android:layout_width="wrap_content"
android:layout_height="20dp"/>
</LinearLayout>
<LinearLayout
android:id="@+id/assess_list_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginRight="40dp"
android:layout_marginLeft="40dp"
android:background="@drawable/course_body_background"
android:padding="20dp"
android:visibility="gone"
>
<ListView
android:id="@+id/course_adapter_assess_list"
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_marginBottom="10dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:text="More" />
<Space
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:text="New"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
这是我的 CourseListAdapter.java 文件,我用它来为课程列表中的每门课程创建每个视图,减去通常的内容:
package com.example.schoolplanner2.adapters;
public class CourseListAdapter extends ArrayAdapter<Course> {
private static final String TAG = "CourseListAdapter";
private Context context;
int mResource;
public CourseListAdapter(@NonNull Context context, int resource, @NonNull ArrayList<Course> objects) {
super(context, resource, objects);
this.context = context;
mResource = resource;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
// get info
String course_code = getItem(position).getCourseCode();
Double course_grade = getItem(position).getCurrentGrade();
// make inflater and inflate the layout
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(mResource, parent, false);
TextView tv_course_code = v.findViewById(R.id.course_adapter_course_code);
TextView tv_course_title = v.findViewById(R.id.course_adapter_course_title);
tv_course_code.setText(course_code);
tv_course_title.setText(String.valueOf(course_grade));
// add on click to each list view element
LinearLayout layout = v.findViewById(R.id.course_adapter_layout);
layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i(TAG, "List view element has been clicked " + course_code);
// expand the view to include a new fragment
LinearLayout assess_list_layout = view.findViewById(R.id.assess_list_layout);
assess_list_layout.setVisibility(View.VISIBLE);
// get the list view and add each course to the course view
ListView assessment_list_view = (ListView) view.findViewById(R.id.course_adapter_assess_list);
AssessmentListAdapter assessAdapter = new AssessmentListAdapter(getContext(), R.layout.assessment_adapter_view, getItem(position).getAssessmentList(), getItem(position));
assessment_list_view.setAdapter(assessAdapter);
}
});
return v;
}
}
如果您需要更多信息,请告诉我。还将就完成同一件事的其他方式提出建议。谢谢你的帮助。 ~赛斯。
编辑:当assess_list_layout.setVisibility(View.VISIBLE) 在onClick 之外时,它确实有效。
进一步编辑:到目前为止我尝试过的事情都无济于事:
- 移动我定义 LinearLayout 组件的位置
- 在父视图上调用 invalidate()
- 使用 runOnUiThread()
- 在我尝试为assess_list_layout 查找ViewById 的行中将视图更改为v,它们是相同的,因此没有帮助。
- 在assess_list_layout 上调用requestLayout()
更新:我现在已经设法在单击 course_adapter_layout 时显示assess_list_layout 部分。现在唯一的问题是视图不再占用屏幕上的空间,它只是变成了一个可滚动的视图,可以上下滚动以查看整个视图。 此外,当我滚动到快速时,它会将视图重置为启动时的状态。
【问题讨论】:
-
为什么不找到你的
linear layout在你找到所有视图的地方可能会有所帮助 -
尝试在父视图上调用 invalidate()
-
使用 runOnUiThread 并放置您的assess_list_layout.setVisibility(View.VISIBLE);在其运行方法中。
-
@ Danish - 所以我将上下文作为构造函数的参数之一,我将其转换为 Activity,然后我用它调用 runOnUiThread,在其中我调用 setVisibility(View.VISIBLE) ,这不起作用。
-
就像您找到
R.id.course_adapter_layout视图一样找到R.id.assess_list_layout,就像这样LinearLayout assess_list_layout = v.findViewById(R.id.assess_list_layout);请注意v.findViewById而不是view.findViewById。也将其移到onClick事件之外