如何使用自定义适配器,同时添加和编辑列表视图项目? [英] How to use custom adapter while adding and editing listview items?

查看:212
本文介绍了如何使用自定义适配器,同时添加和编辑列表视图项目?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实现一个待办事项列表应用程序。我有三个活动:一个主要活动,一是增加活动,一个编辑的活动。在我的主要活动有一个添加按钮和显示待办事项列表视图。当我按下Add按钮,添加活性被执行。在该活动中,有一个任务,一个datepicker和优先级的微调一个EditText。当点击OK按钮,所有这些entred值被发送到主活动的列表视图作为线。而且,当此列表中单击某个项目,编辑活动的执行,用户可以更改的值。然而,在我的code,当用户输入的值,我可以在我的自定义适配器类到达,但是我便无法在列表视图中显示它们。列表视图保持为空。如何解决我的code?

主要活动:

 公共类MainActivity延伸活动{受保护的静态最终字符串编辑=MainTask的;私人ToDoItemAdapter listAdapter;
//私人ToDoItemAdapter myCustomAdapter;
//私人的ArrayList<串GT; listString;
公众的ArrayList<&内的TodoItem GT; listItems中;公共静态最终诠释ADD_TASKS = 1;
公共静态最终诠释EDIT_TASKS = 2;Button按钮;
ListView控件的ListView;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
    initUI();
    使用setListener();
}@覆盖
公共布尔onCreateOptionsMenu(菜单菜单){
    //充气菜单;如果是present这增加了项目操作栏。
    。getMenuInflater()膨胀(R.menu.main,菜单);
    返回true;
}私人无效initUI(){    getViewReferences();
    initializeToDoList();}私人无效使用setListener(){
    // TODO自动生成方法存根
    button.setOnClickListener(新OnClickListener(){        @覆盖
        公共无效的onClick(视图v){
            意图addTaskIntent =新意图(MainActivity.this,AddActivity.class);
            startActivityForResult(addTaskIntent,ADD_TASKS);
        }
    });    listView.setOnItemClickListener(新OnItemClickListener(){        @覆盖
        公共无效onItemClick(适配器视图<>为arg0,ARG1观,诠释ARG2,
                长ARG3){
            // TODO自动生成方法存根
            的System.out.println(ARG2);
            ToDoItemAdapter myAdapter =新ToDoItemAdapter(MainActivity.this,R.layout.editing_task,listItems中);
            listView.setAdapter(myAdapter);
            意图editTaskIntent =新意图(MainActivity.this,EditingTask.class);
            //editTaskIntent.putExtra(\"mainTask,ARG2);
            startActivityForResult(editTaskIntent,EDIT_TASKS);
        }
    });}私人无效getViewReferences(){
    // TODO自动生成方法存根
    按钮=(按钮)findViewById(R.id.addButton);
    ListView控件=(ListView控件)findViewById(R.id.listView);
}
私人无效initializeToDoList(){
    // TODO自动生成方法存根
    时listItems =新的ArrayList<&内的TodoItem GT;();
    // listString =新的ArrayList<串GT;();
    listAdapter =新ToDoItemAdapter(MainActivity.this,R.layout.activity_main,listItems中);
    listView.setAdapter(listAdapter);    查看noTaskView = findViewById(R.id.emptyToDoList);
    listView.setEmptyView(noTaskView);
}@覆盖
保护无效的onActivityResult(INT申请code,INT结果code,意图数据){
    // TODO自动生成方法存根
    如果(结果code == Activity.RESULT_OK){
        开关(要求code){
        案例ADD_TASKS:
            updateToDoList(数据);
            打破;
        案例EDIT_TASKS:
            打破;
        默认:
            打破;
        }
    }    super.onActivityResult(要求code,结果code,数据);
}私人无效updateToDoList(意向数据){
    // TODO自动生成方法存根
    字符串任务= AddActivity.tasks;
    ArrayList的<串GT;清单= data.getStringArrayListExtra(任务);
    串addedTask = list.get(0);
    串addedDeadline = list.get(1);
    串addedPriority = list.get(2);
    内的TodoItem项=新内的TodoItem(addedTask,addedDeadline,0,addedPriority);
    listItems.add(项目);
    //listString.add(addedTask ++ addedDeadline ++ addedPriority);
    Log.w(项目:,listItems.get(0).getTask());
    //Log.w(\"String:\",listString.get(0));
    listAdapter.notifyDataSetChanged();
}

}

ToDoItemAdapter类:

 公共类ToDoItemAdapter扩展ArrayAdapter<&内的TodoItem GT; {    上下文语境;
    私人诠释的资源;
    ArrayList的<&内的TodoItem GT;内的TodoItem;    公共ToDoItemAdapter(上下文的背景下,INT资源的ArrayList<&内的TodoItem GT;对象){        超级(上下文,资源,对象);
        this.context =背景;
        this.resource =资源;
        this.todoItem =物体;
    }    @覆盖
        公共内的TodoItem的getItem(INT位置){
        返回this.todoItem.get(位置);
    }    @覆盖
        公众诠释的getCount(){
        返回this.todoItem.size();
    }    @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        // TODO自动生成方法存根        查看排= convertView;        如果(convertView == NULL)
        {
            / * todoView =新的LinearLayout(的getContext());
            字符串吹气= Context.LAYOUT_INFLATER_SERVICE;
            LayoutInflater立;
            李=(LayoutInflater)的getContext()getSystemService(充气)。
            li.inflate(资源,todoView,真正的);
            * /            LayoutInflater吹气=(LayoutInflater)this.getContext()getSystemService(Context.LAYOUT_INFLATER_SERVICE)。
            行= inflater.inflate(资源,家长,FALSE);
        }
        //的LinearLayout todoView;
        内的TodoItem待办事项=的getItem(位置);
        串taskString = todo.getTask();
        Log.w(任务,taskString);
        串dateString = todo.getDeadline();
        串priorityString = todo.getPriority();
        字符串itemRow = taskString ++ dateString ++ priorityString;        返回行;
    }
}

添加类:

 公共类AddActivity延伸活动{
    私有String []状态;
    私人微调微调;
    INT位置1;
    串优先;    的EditText etDate;
    按钮CHANGE_DATE;
    最终诠释Date_Dialog_ID = 0;
    INT cDay,cMonth,cYear; //这是当前日期的情况下,
    日历CDATE;
    INT SDAY,sMonth,SYEAR; //这是输入的日期的情况下,    受保护的静态最后弦乐任务=addingTask;
    私有静态最后弦乐LOG_TAG =addingTaskActivity;    MainActivity为主;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        // TODO自动生成方法存根
        super.onCreate(savedInstanceState);
        initUI();
        showDatePicker();
        showPriorityLevel();
    }    私人无效showPriorityLevel(){
        // TODO自动生成方法存根
        状态= getResources()getStringArray(R.array.priority_level)。
        微调=(微调)findViewById(R.id.priority_spinner);        ArrayAdapter<串GT; DataAdapter的=新ArrayAdapter<串GT;(这一点,
                android.R.layout.simple_spinner_item,国家);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(DataAdapter的);        spinner.setOnItemSelectedListener(新OnItemSelectedListener(){            @覆盖
            公共无效onItemSelected(适配器视图<>母公司,观景,
                    INT位置,长的id){                位置1 = spinner.getSelectedItemPosition();                开关(位置1)
                {
                    情况下0:优先级=0;
                            打破;
                    情况1:优先=1;
                            打破;
                    案例2:优先=2;
                            打破;
                    案例3:优先=3;
                            打破;
                    案例4:优先=4;
                            打破;
                    案例5:优先=5;
                            打破;
                    案例6:优先=6;
                            打破;
                    案例7:优先=7;
                            打破;
                    案例8:优先=8;
                            打破;
                    案例9:优先=9;
                            打破;
                    默认:打破;
                }
            }            @覆盖
            公共无效onNothingSelected(适配器视图<>为arg0){            }
        });
    }
    私人无效showDatePicker(){
        // TODO自动生成方法存根        etDate =(EditText上)findViewById(R.id.EditText01);
        CHANGE_DATE =(按钮)findViewById(R.id.Button01);
        change_date.setOnClickListener(新OnClickListener(){        @覆盖
        公共无效的onClick(视图v){
        // TODO自动生成方法存根
        //触发DatePickerDialog
        的ShowDialog(Date_Dialog_ID);
        }
        });
        //获取当前日期
        CDATE = Calendar.getInstance();
        cDay = cDate.get(Calendar.DAY_OF_MONTH);
        cMonth = cDate.get(的Calendar.MONTH);
        cYear = cDate.get(Calendar.YEAR);
        //分配与在开始时的当前日期的EditText
        SDAY = cDay;
        sMonth = cMonth;
        SYEAR = cYear;
        updateDateDisplay(SYEAR,sMonth,SDAY);    }    @覆盖
    保护对话框onCreateDialog(INT ID){    开关(ID){
    案例Date_Dialog_ID:
    返回新DatePickerDialog(这一点,onDateSet,cYear,cMonth,
    cDay);
    }
    返回null;
    }    私人无效updateDateDisplay(INT年,月整型,诠释日期){
    // TODO自动生成方法存根
    etDate.setText(日期+ - +(月+ 1)+ - +年);
    }    私人OnDateSetListener onDateSet =新OnDateSetListener(){        @覆盖
        公共无效onDateSet(查看的DatePicker,年整型,诠释monthOfYear,
                INT请将dayOfMonth){
            // TODO自动生成方法存根
            SYEAR =年;
            sMonth = monthOfYear;
            SDAY =请将dayOfMonth;
            updateDateDisplay(SYEAR,sMonth,SDAY);
        }
    };    私人无效initUI(){
        // TODO自动生成方法存根
        的setContentView(R.layout.adding_task);        最终的EditText editTextTask =(EditText上)findViewById(R.id.edit_text_task);
        按钮OKbutton =(按钮)findViewById(R.id.ok_Button);
        最终的EditText editTextDate =(EditText上)findViewById(R.id.EditText01);        OKbutton.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(查看为arg0){
                // TODO自动生成方法存根                ArrayList的<串GT; addedDatas =新的ArrayList<串GT;();                。字符串addingTask = editTextTask.getText()的toString();                字符串期限= editTextDate.getText()的toString()。                //字符串串连=优先级++ addingTask ++期限;                意图myIntent =新的Intent();                addedDatas.add(addingTask);
                addedDatas.add(截止时间);
                addedDatas.add(优先级);                myIntent.putExtra(addingTask,addedDatas);                的setResult(Activity.RESULT_OK,myIntent);                完();
            }
        });
    }}

内的TodoItem类

 公共类内的TodoItem {    字符串的任务;
    字符串的最后期限;
    字符串状态;
    串优先;    公共内的TodoItem(字符串任务,截止字符串,字符串的地位,优先字符串){
        超();
        this.task =任务;
        this.deadline =期限;
        this.status =状态;
        this.priority =优先;
    }    公共字符串getTask(){
        返回任务;
    }    公共字符串getDeadline(){
        退货期限;
    }    公共字符串的getStatus(){
        返回状态;
    }    公共字符串getPriority(){
        返回优先;
    }    @覆盖
    公共字符串的toString(){        返回优先级++任务++截止日期++状态;
    }


解决方案

你应该做的,是确保在添加活动可以访问用于填充的主要活动的ListView中内的TodoItem阵列。然后,它可以只添加或直接修改此列表。然后,你可以调用notifyAdapters()在MainActivity的调用onStart()来检查更新时,它变得可见。

I want to implement a to-do list application. I have three activities: one main activity, one adding activity and one editing activity. In my main activity there is a add button and a listview that shows the to-do items. When I click add button, adding activity is executed. In this activity,there is an edittext for the task, a datepicker and a spinner for priority level. When ok button is clicked, all these entred values are sent to main activity's listview as a line. And, when click an item on this list, editing activity is executed and user can change the values. However, in my code, when user enters the values, I can reach them in my custom adapter class but I could't display them in listview. Listview remains empty. How can i fix my code?

main activity:

public class MainActivity extends Activity {

protected static final String edits = "mainTask";

private ToDoItemAdapter listAdapter;
//private ToDoItemAdapter myCustomAdapter;
//private ArrayList<String> listString;
public ArrayList<ToDoItem> listItems;

public static final int ADD_TASKS = 1;
public static final int EDIT_TASKS = 2;

Button button;
ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initUI();
    setListener();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

private void initUI() {

    getViewReferences();
    initializeToDoList();

}

private void setListener() {
    // TODO Auto-generated method stub
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent addTaskIntent = new Intent(MainActivity.this, AddActivity.class);
            startActivityForResult(addTaskIntent, ADD_TASKS);
        }
    });

    listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            System.out.println(arg2);
            ToDoItemAdapter myAdapter = new ToDoItemAdapter(MainActivity.this,R.layout.editing_task,listItems);
            listView.setAdapter(myAdapter);
            Intent editTaskIntent = new Intent(MainActivity.this, EditingTask.class);
            //editTaskIntent.putExtra("mainTask", arg2);
            startActivityForResult(editTaskIntent, EDIT_TASKS);
        }
    });

}

private void getViewReferences() {
    // TODO Auto-generated method stub
    button = (Button) findViewById(R.id.addButton);
    listView = (ListView) findViewById(R.id.listView);
}


private void initializeToDoList() {
    // TODO Auto-generated method stub
    listItems = new ArrayList<ToDoItem>();
    //listString = new ArrayList<String>();
    listAdapter = new ToDoItemAdapter(MainActivity.this, R.layout.activity_main, listItems);
    listView.setAdapter(listAdapter);

    View noTaskView = findViewById(R.id.emptyToDoList);
    listView.setEmptyView(noTaskView);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    if (resultCode == Activity.RESULT_OK) {
        switch (requestCode) {
        case ADD_TASKS:
            updateToDoList(data);
            break;
        case EDIT_TASKS:
            break;
        default:
            break;
        }
    }

    super.onActivityResult(requestCode, resultCode, data);
}

private void updateToDoList(Intent data) {
    // TODO Auto-generated method stub
    String task = AddActivity.tasks;
    ArrayList<String> list = data.getStringArrayListExtra(task);
    String addedTask = list.get(0);
    String addedDeadline = list.get(1);
    String addedPriority = list.get(2);
    ToDoItem item = new ToDoItem(addedTask, addedDeadline ,"0", addedPriority);
    listItems.add(item);
    //listString.add(addedTask + "   " + addedDeadline + "   " + addedPriority);
    Log.w("Items:",listItems.get(0).getTask());
    //Log.w("String:",listString.get(0));
    listAdapter.notifyDataSetChanged();
}

}

ToDoItemAdapter class:

public class ToDoItemAdapter extends ArrayAdapter<ToDoItem> { 

    Context context;
    private int resource; 
    ArrayList<ToDoItem> todoItem;

    public ToDoItemAdapter(Context context, int resource, ArrayList<ToDoItem> objects) { 

        super(context, resource, objects); 
        this.context = context;
        this.resource = resource;
        this.todoItem = objects;
    } 

    @Override
        public ToDoItem getItem(int position) {
        return this.todoItem.get(position);
    }

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
        // TODO Auto-generated method stub 

        View row = convertView;

        if (convertView == null) 
        { 
            /*todoView = new LinearLayout(getContext()); 
            String inflater = Context.LAYOUT_INFLATER_SERVICE; 
            LayoutInflater li; 
            li = (LayoutInflater)getContext().getSystemService(inflater); 
            li.inflate(resource, todoView, true); 
            */

            LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(resource, parent, false);
        } 


        //LinearLayout todoView; 
        ToDoItem todo = getItem(position); 
        String taskString = todo.getTask(); 
        Log.w("task:", taskString);
        String dateString = todo.getDeadline(); 
        String priorityString = todo.getPriority(); 
        String itemRow = taskString + "   " + dateString + "   " + priorityString;

        return row; 
    } 
}

Adding class:

public class AddActivity extends Activity{


    private String[] states;
    private Spinner spinner;
    int position1;
    String priority;

    EditText etDate;
    Button change_date;
    final int Date_Dialog_ID=0;
    int cDay,cMonth,cYear; // this is the instances of the current date
    Calendar cDate;
    int sDay,sMonth,sYear; // this is the instances of the entered date

    protected static final String tasks = "addingTask";
    private static final String LOG_TAG = "addingTaskActivity";

    MainActivity main;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        initUI();
        showDatePicker();
        showPriorityLevel();
    }

    private void showPriorityLevel() {
        // TODO Auto-generated method stub
        states = getResources().getStringArray(R.array.priority_level);
        spinner = (Spinner) findViewById(R.id.priority_spinner);

        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, states);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);

        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {

                position1 = spinner.getSelectedItemPosition();

                switch(position1)
                {
                    case 0: priority = "0";
                            break;
                    case 1: priority = "1";
                            break;
                    case 2: priority = "2";
                            break;
                    case 3: priority = "3";
                            break;
                    case 4: priority = "4";
                            break;
                    case 5: priority = "5";
                            break;
                    case 6: priority = "6";
                            break;
                    case 7: priority = "7";
                            break;
                    case 8: priority = "8";
                            break;
                    case 9: priority = "9";
                            break;
                    default: break;
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {

            }
        });
    }


    private void showDatePicker() {
        // TODO Auto-generated method stub

        etDate=(EditText)findViewById(R.id.EditText01);
        change_date=(Button)findViewById(R.id.Button01);
        change_date.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
        // TODO Auto-generated method stub
        //triggers the DatePickerDialog
        showDialog(Date_Dialog_ID);
        }
        });
        //getting current date
        cDate=Calendar.getInstance();
        cDay=cDate.get(Calendar.DAY_OF_MONTH);
        cMonth=cDate.get(Calendar.MONTH);
        cYear=cDate.get(Calendar.YEAR);
        //assigning the edittext with the current date in the beginning
        sDay=cDay;
        sMonth=cMonth;
        sYear=cYear;
        updateDateDisplay(sYear,sMonth,sDay);

    }

    @Override
    protected Dialog onCreateDialog(int id) {

    switch (id) {
    case Date_Dialog_ID:
    return new DatePickerDialog(this, onDateSet, cYear, cMonth,
    cDay);
    }
    return null;
    }

    private void updateDateDisplay(int year,int month,int date) {
    // TODO Auto-generated method stub
    etDate.setText(date+"-"+(month+1)+"-"+year);
    }

    private OnDateSetListener onDateSet=new OnDateSetListener() {

        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear,
                int dayOfMonth) {
            // TODO Auto-generated method stub
            sYear=year;
            sMonth=monthOfYear;
            sDay=dayOfMonth;
            updateDateDisplay(sYear,sMonth,sDay);
        }
    };

    private void initUI() {
        // TODO Auto-generated method stub
        setContentView(R.layout.adding_task);

        final EditText editTextTask = (EditText) findViewById(R.id.edit_text_task);
        Button OKbutton = (Button) findViewById(R.id.ok_Button);
        final EditText editTextDate = (EditText) findViewById(R.id.EditText01);

        OKbutton.setOnClickListener(new OnClickListener() {


            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub

                ArrayList<String> addedDatas = new ArrayList<String>();

                String addingTask = editTextTask.getText().toString();

                String deadline = editTextDate.getText().toString();

                //String concatenate = priority + "   " + addingTask + "   " +  deadline;

                Intent myIntent = new Intent();

                addedDatas.add(addingTask);
                addedDatas.add(deadline);
                addedDatas.add(priority);

                myIntent.putExtra("addingTask", addedDatas);

                setResult(Activity.RESULT_OK, myIntent);

                finish();
            }
        });
    }

}

ToDoItem class

public class ToDoItem {

    String task;
    String deadline;
    String status;
    String priority;

    public ToDoItem(String task, String deadline, String status, String priority) {
        super();
        this.task = task;
        this.deadline = deadline;
        this.status = status;
        this.priority = priority;
    }

    public String getTask() {
        return task;
    }

    public String getDeadline() {
        return deadline;
    }

    public String getStatus() {
        return status;
    }

    public String getPriority() {
        return priority;
    }

    @Override
    public String toString() {

        return priority +  "   " + task + "   " + deadline + "   " + status;
    }

解决方案

What you should do, is make sure that the Adding Activity can access the ToDoItem Array that is used to populate the ListView in the Main Activity. Then it can just add to or modify this list directly. Then you can call a notifyAdapters() in onStart() of MainActivity to check for updates whenever it becomes visible.

这篇关于如何使用自定义适配器,同时添加和编辑列表视图项目?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆