Java Android:ListView在OnClickListener中不工作

Java Android:ListView在OnClickListener中不工作,java,android,xml,Java,Android,Xml,我正在尝试创建一个列表视图,其中包含一个用于列出应用程序的复选框 我已经正确地编码了复选框,因此我正在尝试在列表视图中显示复选框 XML <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools

我正在尝试创建一个
列表视图
,其中包含一个用于列出应用程序的
复选框

我已经正确地编码了
复选框
,因此我正在尝试在
列表视图中显示
复选框

XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rootContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/taskListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>

    <EditText
        android:id="@+id/new_task"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="New Task"
        android:inputType="textCapSentences" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Create" />

</LinearLayout>

爪哇

public类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button Button=(Button)findViewById(R.id.Button);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
ListView ListView=findViewById(R.id.taskListView);
EditText newTask=findviewbyd(R.id.new_任务);
复选框=新复选框(MainActivity.this);
String task=newTask.getText().toString();
newTask.setText(任务);
checkBox.setText(任务);
ListAdapter myListAdapter=new ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,任务);
ListView taskListView=(ListView)findViewById(R.id.taskListView);
setAdapter(myListAdapter);
}
});
}
}
我已经为
ListView
编写了Java代码,但出现以下错误:

无法解析构造函数“ArrayAdapter(匿名android.view.view.OnClickListener,int,java.lang.String)”


问题是您正在将clicklistner传递给适配器,但适配器需要上下文

首先,创建上下文对象并将活动传递给该上下文

在AppCompative活动中添加:

private Context context ;
然后在onCreate中初始化此上下文,如:

context = this ;
其次,您需要将列表传递给适配器。所以,创建任务的字符串arraylist并传递给适配器

ArrayList<String> list = new ArrayList<>() ;
list.add(task) ;
ArrayList list=new ArrayList();
列表。添加(任务);
现在将此上下文和列表传递给arrayadapter:

myListAdapter = new ArrayAdapter<String>(context,android.R.layout.simple_list_item_1,list);
myListAdapter=新的ArrayAdapter(上下文,android.R.layout.simple\u list\u item\u 1,list);

您必须使用自定义ListView适配器,在一个布局中显示复选框和文本。如果只想显示不带复选框的文本,可以使用如下方式:

public类MainActivity扩展了AppCompatActivity{
列出任务;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tasks=newarraylist();
Button Button=(Button)findViewById(R.id.Button);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
ListView ListView=findViewById(R.id.taskListView);
EditText newTask=findviewbyd(R.id.new_任务);
String task=newTask.getText().toString();
任务。添加(任务);
ListAdapter myListAdapter=new ArrayAdapter(这是android.R.layout.simple_list_item_1,tasks.toArray(新字符串[0]);
ListView taskListView=(ListView)findViewById(R.id.taskListView);
setAdapter(myListAdapter);
}
});
}
}
有了复选框,情况就复杂多了:必须定义自定义布局和自定义阵列适配器

阵列适配器如下所示:

公共类MyListAdapter扩展了ArrayAdapter{
私人最终活动背景;
私有最终字符串[]任务;
完成私人决赛;
公共MyListAdapter(活动上下文,字符串[]任务,布尔[]已完成){
super(上下文,R.layout.mylist,主标题);
//TODO自动生成的构造函数存根
this.context=context;
这个。任务=任务;
这个。完成=完成;
}  
公共视图getView(int位置、视图视图、视图组父级){
LayoutInflater充气器=上下文。getLayoutInflater();
视图行视图=充气机。充气(R.layout.mylist,null,true);
Checkbox check=(Checkbox)rowView.findviewbyd(R.id.Checkbox);
TextView任务=(TextView)rowView.findViewById(R.id.task);
检查。设置检查(已完成[位置]);
task.setText(任务[位置]);
返回行视图;
}  
}
自定义布局为
mylist.xml
,如下所示:


然后您必须将主类更改为:

public类MainActivity扩展了AppCompatActivity{
列出任务;
已完成的清单;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tasks=newarraylist();
Button Button=(Button)findViewById(R.id.Button);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
ListView ListView=findViewById(R.id.taskListView);
EditText newTask=findviewbyd(R.id.new_任务);
String task=newTask.getText().toString();
任务。添加(任务);
已完成。添加(假);
MyListAdapter MyListAdapter=新的MyListAdapter(这是tasks.toArray(新字符串[0]),completed.toString(新布尔值[0]);
ListView taskListView=(ListView)findViewById(R.id.taskListView);
setAdapter(myListAdapter);
}
});
}
}
编辑: 如果您只想使用Java代码创建条目,则可以将自定义适配器中的getView方法替换为以下方法:

public View getView(int位置、视图视图、视图组父视图){
LinearLayout行视图=新的LinearLayout(上下文);
复选框check=新复选框(上下文);
TextView任务=新的TextView(上下文);
检查。设置检查(已完成[位置]);
助教
myListAdapter = new ArrayAdapter<String>(context,android.R.layout.simple_list_item_1,list);