Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android应用程序开发|自定义BaseAdapter不工作_Android - Fatal编程技术网

Android应用程序开发|自定义BaseAdapter不工作

Android应用程序开发|自定义BaseAdapter不工作,android,Android,我正在制作一个planner应用程序,每周都有相同的任务。我首先使用ArrayAdapter显示所选日期的所有任务,但后来我决定制作自己的适配器。我从来没有做过一个,所以我在互联网上看了看,然后主要通过复制粘贴和更改变量来做我的。当我在EditActivity中添加任务时,您可以看到它,但是当您切换所选日期并返回时,或者如果您转到DisplayActivity,它就消失了。没有错误。我也尝试过实现Filterable,但我也不知道它是什么,所以我主要是复制粘贴 TaskAdapter publi

我正在制作一个planner应用程序,每周都有相同的任务。我首先使用ArrayAdapter显示所选日期的所有任务,但后来我决定制作自己的适配器。我从来没有做过一个,所以我在互联网上看了看,然后主要通过复制粘贴和更改变量来做我的。当我在EditActivity中添加任务时,您可以看到它,但是当您切换所选日期并返回时,或者如果您转到DisplayActivity,它就消失了。没有错误。我也尝试过实现Filterable,但我也不知道它是什么,所以我主要是复制粘贴

TaskAdapter

public class TaskAdapter extends BaseAdapter /*implements Filterable*/ {
private HashMap<Task, ViewHolder> holders = new HashMap<>();
private List<Task> mData = new ArrayList<>();
private LayoutInflater mInflater;

public TaskAdapter(Context context, List<Task> tasks) {
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mData = tasks;
    holders = new HashMap<>();
    for (Task task : tasks) {
        if (holders.containsKey(task))
            return;
        ViewHolder holder = new ViewHolder();
        View convertView = mInflater.inflate(R.layout.list_item, null);
        holder.textView = (TextView) convertView.findViewById(R.id.list_item_text);
        convertView.setTag(holder);
        holders.put(task, holder);
    }
}

public void addItem(final Task task) {
    mData.add(task);
    notifyDataSetChanged();
    if (holders.containsKey(task))
        return;
    ViewHolder holder = new ViewHolder();
    View convertView = mInflater.inflate(R.layout.list_item, null);
    holder.textView = (TextView) convertView.findViewById(R.id.list_item_text);
    convertView.setTag(holder);
    holders.put(task, holder);
}

public void removeItem(final Task task) {
    mData.remove(task);
    holders.remove(task);
}

public void setItem(int position, Task task) {
    mData.set(position, task);
}

@Override
public int getCount() {
    return mData.size();
}

@Override
public Task getItem(int position) {
    return mData.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
        holder = new ViewHolder();
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder.textView = (TextView) convertView.findViewById(R.id.list_item_text);
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.textView.setText(mData.get(position).getTask());
    return convertView;
}

public TextView getTextView(Task task) {
    return holders.get(task).textView;
}

/*
@Override
public Filter getFilter() {
    return new Filter() {

        @Override
        protected void publishResults(CharSequence constraint,
                                      FilterResults results) {
            mData = (List<Task>) results.values;
            TaskAdapter.this.notifyDataSetChanged();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            List<Task> filteredResults = getFilteredResults(constraint);

            FilterResults results = new FilterResults();

            results.values = filteredResults;

            return results;
        }
    };
} */

public static class ViewHolder {
    public TextView textView;
}
公共类TaskAdapter扩展BaseAdapter/*实现可过滤*/{
私有HashMap holders=newhashmap();
private List mData=new ArrayList();
私人停车场;
公共任务适配器(上下文、列表任务){
mInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
mData=任务;
holders=newhashmap();
for(任务:任务){
if(持有人、集装箱(任务))
返回;
ViewHolder=新的ViewHolder();
View convertView=mInflater.充气(R.layout.list_项,空);
holder.textView=(textView)convertView.findViewById(R.id.list\u item\u text);
convertView.setTag(支架);
持有者。放置(任务,持有者);
}
}
公共无效附加项(最终任务){
mData.add(任务);
notifyDataSetChanged();
if(持有人、集装箱(任务))
返回;
ViewHolder=新的ViewHolder();
View convertView=mInflater.充气(R.layout.list_项,空);
holder.textView=(textView)convertView.findViewById(R.id.list\u item\u text);
convertView.setTag(支架);
持有者。放置(任务,持有者);
}
public void removietem(最终任务){
mData.remove(任务);
移除(任务);
}
公共void集合项(int位置,任务){
mData.set(位置、任务);
}
@凌驾
public int getCount(){
返回mData.size();
}
@凌驾
公共任务getItem(int位置){
返回mData.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
holder=新的ViewHolder();
convertView=mInflater.充气(R.layout.list_项,空);
holder.textView=(textView)convertView.findViewById(R.id.list\u item\u text);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
holder.textView.setText(mData.get(position.getTask());
返回视图;
}
公共文本视图getTextView(任务){
返回持有者.get(任务).textView;
}
/*
@凌驾
公共过滤器getFilter(){
返回新筛选器(){
@凌驾
受保护的无效发布结果(CharSequence约束,
FilterResults(结果){
mData=(列表)results.values;
TaskAdapter.this.notifyDataSetChanged();
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
List filteredResults=getFilteredResults(约束);
FilterResults results=新的FilterResults();
results.values=filteredResults;
返回结果;
}
};
} */
公共静态类视图持有者{
公共文本视图文本视图;
}
}

EditActivity-onCreate()

if(getIntent().getExtras()!=null){
selectedDay=getIntent().getExtras().getString(“天”);
列出任务=获取任务(selectedDay);
添加(新任务(this,getIntent().getExtras().getString(“任务名称”),false,true));
设置任务(选择日期、任务);
更新列表(任务);
}
EditActivity-设置任务(字符串日)

private void setTasks(字符串日,列出任务){
试一试{
FileOutputStream FileOutputStream=openFileOutput(day+“.dat”,MODE_PRIVATE);
ObjectOutputStream ObjectOutputStream=新的ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(任务);
}捕获(IOE异常){
e、 printStackTrace();
}
}
EditActivity-updateList()

private void updateList(列出任务){
如果(tasks.size()==0){
noPlanTextView.setVisibility(View.VISIBLE);
}否则{
noPlanTextView.setVisibility(View.INVISIBLE);
}
TaskAdapter=新TaskAdapter(此为任务);
adapter.notifyDataSetChanged();
ListView ListView=(ListView)findViewById(R.id.ListView\u编辑);
setAdapter(适配器);
}

我只粘贴了我认为重要/有用的代码。如果你还需要,请告诉我。谢谢

编辑活动和显示活动如何交互?我目前还不知道你的应用程序是如何工作的,但每次更新列表时,你似乎都会创建一个新的适配器实例,你应该只做
adapter.addItem()然后
适配器.notifyDataSetChanged()
或类似的东西您需要HashMap持有者做什么?如果您是新手,似乎应该使用
ArrayAdapter
this@JonathanDarryl我每次都在创建一个新实例。我现在将生成一个全局变量。@pskink它是这样我就可以通过给出任务来获得ViewHolder&TextView。我需要它,以便在任务完成时可以浏览文本视图。您只需更新适配器内的数据模型并调用
适配器#notifyDataSetChanged()
,无需任何持有者地图编辑活动和显示活动如何交互?我目前还不知道你的应用程序是如何工作的,但每次更新列表时,你似乎都会创建一个新的适配器实例,你应该只做
adapter.addItem()然后
适配器.notifyDataSetChan
if (getIntent().getExtras() != null) {
        selectedDay = getIntent().getExtras().getString("DAY");

        List<Task> tasks = getTasks(selectedDay);
        tasks.add(new Task(this, getIntent().getExtras().getString("TASK_NAME"), false, true));
        setTasks(selectedDay, tasks);
        updateList(tasks);
    }
    private void setTasks(String day, List<Task> tasks) {
    try {
        FileOutputStream fileOutputStream = openFileOutput(day + ".dat", MODE_PRIVATE);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(tasks);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
    private void updateList(List<Task> tasks) {
    if (tasks.size() == 0) {
        noPlanTextView.setVisibility(View.VISIBLE);
    } else {
        noPlanTextView.setVisibility(View.INVISIBLE);
    }
    TaskAdapter adapter = new TaskAdapter(this, tasks);
    adapter.notifyDataSetChanged();
    ListView listView = (ListView) findViewById(R.id.listview_edit);
    listView.setAdapter(adapter);
}