Java View.gettag返回null,我在ListView/ArrayAdapter设置中遗漏了什么?
我有一个自定义类“Something”,它包含一些int和字符串。我正在创建一个页面,允许用户查看每个当前内容的描述,并在每个页面旁边创建一个按钮来编辑或删除 我已经重写了Something类中的toString(),因此它可以返回一个要放入TextView字段的描述 list_task_edit.xml:Java View.gettag返回null,我在ListView/ArrayAdapter设置中遗漏了什么?,java,android,listview,adapter,Java,Android,Listview,Adapter,我有一个自定义类“Something”,它包含一些int和字符串。我正在创建一个页面,允许用户查看每个当前内容的描述,并在每个页面旁边创建一个按钮来编辑或删除 我已经重写了Something类中的toString(),因此它可以返回一个要放入TextView字段的描述 list_task_edit.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http:/
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".EditTaskList">
...
<ListView
android:id="@+id/edit_task_listview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
...
</LinearLayout>
...
...
编辑任务列表项目.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/edit_task_name"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/edit_task_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_edittask"
android:onClick=""
/>
<Button
android:id="@+id/edit_task_delete"
android:layout_width="wrap_content"
android:text="@string/button_delete_task"
android:layout_height="wrap_content"
android:onClick="deleteTask"
/>
</LinearLayout>
(我还没有为editTask设置一个方法,因为我还不能胜任这个工作)
公共类EditTaskList扩展活动{
私有静态数组列表;
ArrayAdapter ArrayAdapter;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.list\u task\u edit);
list=MainActivity.getMasterList();
arrayAdapter=新的arrayAdapter
(本,
R.layout.edit\u task\u list\u项,
R.id.edit\u任务\u名称,
名单);
ListView ListView=(ListView)findViewById(R.id.edit\u task\u ListView);
setAdapter(arrayAdapter);
}
公共void deleteTask(视图){
thisItem=(Something)view.getTag();
如果(thisItem==null){
System.out.println(“坏东西”);
}
阵列适配器。删除(此项);
arrayAdapter.notifyDataSetChanged();
}
...
}
我的诊断行检查thisItem==null是否每次都关闭。我错过了什么?我是否声明ArrayAdapter有误?您的deleteTask事件不会返回列表项,而是返回一个按钮视图 要获得所需的功能,您应该构建一个自定义适配器来跟踪列表项。为此,您需要扩展BaseAdapter 有关更多详细信息,请参阅此响应:
关键的一点是,在GetView方法中,您可以在列表按钮上设置一个标记,该标记表示容器项的位置。这将允许您删除OnClickListener中该位置为按钮指定的项。deleteTask事件不会返回列表项,而是返回按钮视图 要获得所需的功能,您应该构建一个自定义适配器来跟踪列表项。为此,您需要扩展BaseAdapter 有关更多详细信息,请参阅此响应:
关键的一点是,在GetView方法中,您可以在列表按钮上设置一个标记,该标记表示容器项的位置。然后,这将允许您删除OnClickListener中该位置为按钮指定的项。更新的工作代码。如果对其他人有用:
public class EditTaskList extends Activity {
private static ArrayList<Something> list;
private CustomAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_task_edit);
ListView listView = (ListView)findViewById(R.id.edit_task_listview);
list = MainActivity.getMasterList();
adapter = new CustomAdapter(this, list);
listView.setAdapter(adapter);
}
public void resetAdapter(){
adapter.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.edit_task_list, menu);
return true;
}
public class CustomAdapter extends ArrayAdapter<Something>{
private ArrayList<Something> things;
private LayoutInflater inflater;
class ViewHolder {
public TextView text;
public Button editButton;
public Button deleteButton;
}
public CustomAdapter(Context context, ArrayList<Something> things) {
super(context, R.layout.edit_task_list_item, things);
inflater = LayoutInflater.from(context);
this.things = things;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// reuse views
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.edit_task_list_item, null);
// configure view holder
viewHolder.text = (TextView) convertView.findViewById(R.id.edit_task_name);
viewHolder.editButton = (Button) convertView.findViewById(R.id.edit_task_edit);
viewHolder.deleteButton = (Button) convertView.findViewById(R.id.edit_task_delete);
convertView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.text.setTag(position);
viewHolder.text.setText(things.get(position).toString());
viewHolder.deleteButton.setTag(position);
viewHolder.editButton.setTag(position); //currently does nothing
viewHolder.deleteButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
int tag = (Integer)view.getTag();
things.remove(tag);
resetAdapter();
}
});
return convertView;
}
}
}
公共类EditTaskList扩展活动{
私有静态数组列表;
专用自定义适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.list\u task\u edit);
ListView ListView=(ListView)findViewById(R.id.edit\u task\u ListView);
list=MainActivity.getMasterList();
适配器=新的CustomAdapter(此,列表);
setAdapter(适配器);
}
public void resetAdapter(){
adapter.notifyDataSetChanged();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.edit_task_list,menu);
返回true;
}
公共类CustomAdapter扩展了ArrayAdapter{
私人物品;
私人充气机;
类视图持有者{
公共文本查看文本;
公共按钮编辑按钮;
公共按钮删除按钮;
}
公共CustomAdapter(上下文、ArrayList内容){
super(上下文、R.layout.edit_任务、列表、项目、事物);
充气器=充气器。从(上下文);
这个东西=东西;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//重用视图
持票人持票人;
if(convertView==null){
viewHolder=新的viewHolder();
convertView=充气机.充气(R.layout.edit\u task\u list\u item,空);
//配置视图保持架
viewHolder.text=(TextView)convertView.findViewById(R.id.edit\u task\u name);
viewHolder.editButton=(按钮)convertView.findViewById(R.id.edit\u task\u edit);
viewHolder.deleteButton=(按钮)convertView.findViewById(R.id.edit\u task\u delete);
convertView.setTag(viewHolder);
}
否则{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.text.setTag(位置);
viewHolder.text.setText(things.get(position.toString());
viewHolder.deleteButton.setTag(位置);
viewHolder.editButton.setTag(位置);//当前不执行任何操作
viewHolder.deleteButton.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图){
int标记=(整数)view.getTag();
移除(标签);
重置适配器();
}
});
返回视图;
}
}
}
更新的工作代码。如果对其他人有用:
public class EditTaskList extends Activity {
private static ArrayList<Something> list;
private CustomAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_task_edit);
ListView listView = (ListView)findViewById(R.id.edit_task_listview);
list = MainActivity.getMasterList();
adapter = new CustomAdapter(this, list);
listView.setAdapter(adapter);
}
public void resetAdapter(){
adapter.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.edit_task_list, menu);
return true;
}
public class CustomAdapter extends ArrayAdapter<Something>{
private ArrayList<Something> things;
private LayoutInflater inflater;
class ViewHolder {
public TextView text;
public Button editButton;
public Button deleteButton;
}
public CustomAdapter(Context context, ArrayList<Something> things) {
super(context, R.layout.edit_task_list_item, things);
inflater = LayoutInflater.from(context);
this.things = things;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// reuse views
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.edit_task_list_item, null);
// configure view holder
viewHolder.text = (TextView) convertView.findViewById(R.id.edit_task_name);
viewHolder.editButton = (Button) convertView.findViewById(R.id.edit_task_edit);
viewHolder.deleteButton = (Button) convertView.findViewById(R.id.edit_task_delete);
convertView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.text.setTag(position);
viewHolder.text.setText(things.get(position).toString());
viewHolder.deleteButton.setTag(position);
viewHolder.editButton.setTag(position); //currently does nothing
viewHolder.deleteButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
int tag = (Integer)view.getTag();
things.remove(tag);
resetAdapter();
}
});
return convertView;
}
}
}
公共类EditTaskList扩展活动{
私有静态数组列表;
专用自定义适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.list\u task\u edit);
ListView ListView=(ListView)findViewById(R.id.edit\u task\u ListView);
list=MainActivity.getMasterList();
适应