Java View.gettag返回null,我在ListView/ArrayAdapter设置中遗漏了什么?

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:/

我有一个自定义类“Something”,它包含一些int和字符串。我正在创建一个页面,允许用户查看每个当前内容的描述,并在每个页面旁边创建一个按钮来编辑或删除

我已经重写了Something类中的toString(),因此它可以返回一个要放入TextView字段的描述

list_task_edit.xml:

<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();
适应