Java Android设置可见性功能不工作
几个小时以来,我一直在以下代码中尝试使用setVisibility()函数: 以下是适配器类:Java Android设置可见性功能不工作,java,android,xml,Java,Android,Xml,几个小时以来,我一直在以下代码中尝试使用setVisibility()函数: 以下是适配器类: public class ExamScheduleAdapter extends ArrayAdapter<String>{ private ArrayList<String> id; private ArrayList<String> name; private ArrayList<String> date, subject, total, passi
public class ExamScheduleAdapter extends ArrayAdapter<String>{
private ArrayList<String> id;
private ArrayList<String> name;
private ArrayList<String> date, subject, total, passing;
private Activity context;
Button idview;
TextView nameview, dateview, subjectview, totalview, passview;
public ExamScheduleAdapter(Activity context, ArrayList<String>id, ArrayList<String>name, ArrayList<String>date) {
super(context, R.layout.fragment_exam_shedule, id);
this.id = id;
this.name = name;
this.date = date;
this.context = context;
}
public ExamScheduleAdapter(Activity context, ArrayList<String>id, ArrayList<String>name, ArrayList<String>date,
ArrayList<String>subject, ArrayList<String>total, ArrayList<String>passing) {
super(context, R.layout.fragment_exam_shedule, id);
this.id = id;
this.name = name;
this.date = date;
this.subject = subject;
this.total = total;
this.passing = passing;
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
LayoutInflater inflater = context.getLayoutInflater();
View listviewItem = inflater.inflate(R.layout.list_es,null,true);
idview=(Button) listviewItem.findViewById(R.id.es_list_id);
nameview=(TextView)listviewItem.findViewById(R.id.es_list_exam_name);
dateview=(TextView)listviewItem.findViewById(R.id.es_list_date);
subjectview=listviewItem.findViewById(R.id.es_list_exam_subject);
totalview=listviewItem.findViewById(R.id.es_list_exam_t_marks);
passview=listviewItem.findViewById(R.id.es_list_exam_p_marks);
idview.setText(id.get(position));
nameview.setText(name.get(position));
dateview.setText(date.get(position));
idview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(subjectview.getVisibility()==View.GONE){
subjectview.setVisibility(View.VISIBLE);
totalview.setVisibility(View.VISIBLE);
passview.setVisibility(View.VISIBLE);
subjectview.invalidate();
totalview.invalidate();
passview.invalidate();
Toast.makeText(getContext(), "Now visible", Toast.LENGTH_LONG).show();
}
else{
subjectview.setVisibility(View.GONE);
totalview.setVisibility(View.GONE);
passview.setVisibility(View.GONE);
subjectview.invalidate();
totalview.invalidate();
passview.invalidate();
Toast.makeText(getContext(), "Now invisible", Toast.LENGTH_LONG).show();
}
}
});
return listviewItem;
}
}
公共类ExamScheduleAdapter扩展了ArrayAdapter{
私有ArrayList id;
私有ArrayList名称;
private ArrayList日期、主题、总计、通过;
私人活动语境;
按钮idview;
TextView名称视图、日期视图、subjectview、totalview、passview;
公共ExamScheduleApter(活动上下文、ArrayList、ArrayList名称、ArrayList日期){
super(上下文,R.layout.fragment\u检查时间表,id);
this.id=id;
this.name=名称;
this.date=日期;
this.context=上下文;
}
public ExamScheduleApter(活动上下文、ArrayListid、ArrayListname、ArrayListdate、,
ArrayListsubject、ArrayListtotal、ArrayListpassing){
super(上下文,R.layout.fragment\u检查时间表,id);
this.id=id;
this.name=名称;
this.date=日期;
this.subject=主语;
这个.总计=总计;
这个。通过=通过;
this.context=上下文;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutInflater充气器=上下文。getLayoutInflater();
查看列表视图项=充气机。充气(R.layout.list_es,null,true);
idview=(按钮)listviewItem.findViewById(R.id.es\u list\u id);
nameview=(TextView)listviewItem.findViewById(R.id.es\u列表\u考试\u名称);
dateview=(TextView)listviewItem.findViewById(R.id.es\u list\u date);
subjectview=listviewItem.findViewById(R.id.es\u列表\u考试\u科目);
totalview=listviewItem.findViewById(R.id.es\U列表\U考试分数);
passview=listviewItem.findViewById(R.id.es\U列表\U考试\U分数);
idview.setText(id.get(position));
nameview.setText(name.get(position));
dateview.setText(date.get(position));
idview.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(subjectview.getVisibility()==View.GONE){
subjectview.setVisibility(View.VISIBLE);
设置可见性(View.VISIBLE);
passview.setVisibility(View.VISIBLE);
subjectview.invalidate();
totalview.invalidate();
passview.invalidate();
Toast.makeText(getContext(),“现在可见”,Toast.LENGTH_LONG.show();
}
否则{
subjectview.setVisibility(View.GONE);
totalview.setVisibility(View.GONE);
passview.setVisibility(View.GONE);
subjectview.invalidate();
totalview.invalidate();
passview.invalidate();
Toast.makeText(getContext(),“现在不可见”,Toast.LENGTH_LONG.show();
}
}
});
返回listviewItem;
}
}
自定义列表的布局:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp">
<Button
android:id="@+id/es_list_id"
android:layout_height="wrap_content"
android:text="Exam1"
android:layout_row="0"
android:layout_column="0"
android:layout_columnSpan="2"/>
<TextView
android:layout_height="wrap_content"
android:id="@+id/es_list_exam_name"
android:hint="name"
android:layout_row="0"
android:layout_column="2"
android:layout_columnSpan="5" />
<TextView
android:id="@+id/es_list_date"
android:layout_height="wrap_content"
android:hint="2018-07-06"
android:layout_row="0"
android:layout_column="8"
android:layout_columnSpan="3"/>
<TextView
android:layout_height="wrap_content"
android:id="@+id/es_list_exam_subject"
android:hint="Hindi"
android:layout_row="1"
android:layout_column="0"
android:visibility="gone"/>
<TextView
android:layout_height="wrap_content"
android:id="@+id/es_list_exam_t_marks"
android:hint="100"
android:layout_row="1"
android:layout_column="4"
android:visibility="gone"/>
<TextView
android:layout_height="wrap_content"
android:id="@+id/es_list_exam_p_marks"
android:hint="35"
android:layout_row="1"
android:layout_column="8"
android:visibility="gone"/>
</GridLayout>
onclick功能正在被触发,并且它还能够在toast消息正确显示时检查可见性(“现在可见”,或者在其他单击时同时显示消息)
有什么问题吗?我已经尝试了所有的选择。我使用了无效,没有无效,使用了view.go,view.invisible等,但似乎没有任何效果
Plz帮助!提前感谢您。您的
subjectview
,totalview
和passview
变量的作用域在适配器中,而不是在每个适配器项中。因此,使用getView()
实例化的最新一个适配器项将用它们自己的值覆盖它们
将getView()
中的变量更改为本地变量,以便每个OnClickListener
都有自己的副本。适配器中的getView()
方法被调用,以创建屏幕上显示的每个列表项视图。这样,每次代码都会覆盖全局变量
Button idview;
TextView nameview, dateview, subjectview, totalview, passview;
您永远不知道它最终将包含哪些列表项视图
使用final
local变量,而不是声明全局变量:
final Button idview=(Button) listviewItem.findViewById(R.id.es_list_id);
final TextView nameview=(TextView)listviewItem.findViewById(R.id.es_list_exam_name);
final TextView dateview=(TextView)listviewItem.findViewById(R.id.es_list_date);
final TextView subjectview=listviewItem.findViewById(R.id.es_list_exam_subject);
final TextView totalview=listviewItem.findViewById(R.id.es_list_exam_t_marks);
final TextView passview=listviewItem.findViewById(R.id.es_list_exam_p_marks);
(不要忘记移除)
您是否尝试使用notifydataChanged?此处的列表是什么?看起来您不了解listview的工作原理。我已经尝试过了。它不起作用。是否有其他解决方案?如果变量声明为本地变量,则显示错误(红色下划线)在onclicklistener for variables中,是否有其他解决方案???看起来您使用的是Java 7而不是Java 8。然后,该变量也需要显式地
final
,才能传递给一个与click listener类似的非内部类实例。
Button idview;
TextView nameview, dateview, subjectview, totalview, passview;