首页 > 解决方案 > 如何从 View.gone 恢复视图。在xml中使用'android:visibility =“gone”'后setVisibility(View.VISIBLE)不起作用

问题描述

我的问题:在我的 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 之外时,它确实有效。

进一步编辑:到目前为止我尝试过的事情无济于事:

更新:我现在已经设法在单击 course_adapter_layout 时显示assess_list_layout 部分。现在唯一的问题是视图不再占用屏幕上的空间,它只是变成了一个可滚动的视图,可以上下滚动以查看整个视图。此外,当我滚动到快速时,它会将视图重置为启动时的方式。

标签: javaandroidxml

解决方案


LinearLayout assess_list_layout = view.findViewById(R.id.assess_list_layout);
assess_list_layout.setVisibility(View.VISIBLE);

保持这个全局而不是它的工作,不需要使用View.VISIBLE,保持变量唯一

不要使用它,your XML,因为它会混淆。

android:visibility="gone"

XML 文件:

@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);

    LinearLayout assess_list_layout = v.findViewById(R.id.assess_list_layout);
    ListView assessment_list_view = (ListView) v.findViewById(R.id.course_adapter_assess_list);
    
    assess_list_layout.setVisibility(View.GONE);
    
    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
        assess_list_layout.setVisibility(View.VISIBLE);

        // get the list view and add each course to the course view
        
        AssessmentListAdapter assessAdapter = new AssessmentListAdapter(getContext(), R.layout.assessment_adapter_view, getItem(position).getAssessmentList(), getItem(position));
        assessment_list_view.setAdapter(assessAdapter);
      }
    });

    return v;
  }
}

推荐阅读