我在弄清楚这个阵列适配器的东西时遇到了很多麻烦。
我将其与一些教程和本页面的帮助放在一起,当在项目列表视图中单击按钮时如何从android的列表视图添加/删除项目
但是我遇到一个问题,即在运行getView时,“适配器”设置为“空”。我不知道这是怎么回事。我已经解决了将适配器备份到backupAdapter,然后在需要调用adapter.notifyDataSetChanged();时将其复制回来的可怕的hacky解决方案。
我发现我第一次使用deleteButton时,resetAdapter发现适配器为null,然后从backupAdapter复制该值。之后就可以了,不需要再次还原。所以我的代码可以用,但是太可怕了。我究竟做错了什么?
public class EditTaskList extends Activity {
private static ArrayList<Something> list;
private CustomAdapter adapter;
private CustomAdapter backupAdapter;
@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();
CustomAdapter adapter = new CustomAdapter(this, list);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
backupAdapter = adapter;
}
public void resetAdapter(){
if(adapter == null){
System.out.println("Not fixed");
adapter = backupAdapter;
}
else{System.out.println("Fixed!");}
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 Context context;
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);
viewHolder.deleteButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
int tag = (Integer)view.getTag();
things.remove(tag);
resetAdapter();
}
});
return convertView;
}
}
}
这行:
CustomAdapter adapter = new CustomAdapter(this, list);
创建一个局部变量,因此永远不会初始化字段适配器。相反,您想使用以下命令将新创建的适配器分配给该字段:
adapter = new CustomAdapter(this, list);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句