cgbs
cgbs

Reputation: 83

How to use custom adapter while editing listview items when they are clicked?

I have two activities. One is main activity (one add button and one listview), the other one has edittext for task name, datepicker for date, spinner for priority of task. When ı start this app it shows add button, when ı click this button it shows edittext, datepicker and spinner, when ı fill these fields and click ok button it adds this on mainactivity's listview. My code provides to add new items to listview but i confused on how to edit these items. When i click on one of the items in listview ı want to create new edit activity (this activity must also has an edittext, spinner, datepicker with the its entered values from the user.) and this activity updates/edits the items of the mainactivity's listview. In my code, when i click an item in the listview, i get an error like this:

LogCat:

11-11 16:47:38.311: E/AndroidRuntime(1015): FATAL EXCEPTION: main
11-11 16:47:38.311: E/AndroidRuntime(1015): java.lang.ClassCastException: android.widget.Spinner cannot be cast to android.widget.TextView
11-11 16:47:38.311: E/AndroidRuntime(1015):     at com.example.enhancedtodolistapplication.ToDoItemAdapter.getView(ToDoItemAdapter.java:52)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.widget.AbsListView.obtainView(AbsListView.java:2177)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1247)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.widget.ListView.onMeasure(ListView.java:1159)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.View.measure(View.java:15848)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.View.measure(View.java:15848)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.View.measure(View.java:15848)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:302)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.View.measure(View.java:15848)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5008)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2189)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.View.measure(View.java:15848)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1905)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1104)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1284)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.Choreographer.doFrame(Choreographer.java:532)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.os.Handler.handleCallback(Handler.java:730)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.os.Looper.loop(Looper.java:137)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at android.app.ActivityThread.main(ActivityThread.java:5103)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at java.lang.reflect.Method.invokeNative(Native Method)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at java.lang.reflect.Method.invoke(Method.java:525)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-11 16:47:38.311: E/AndroidRuntime(1015):     at dalvik.system.NativeStart.main(Native Method)

Here is my code:

AddActivity.java

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();
        }
    });
}

}

MainActivity.java

public class MainActivity extends Activity {

protected static final String edits = "mainTask";

private ArrayAdapter<String> 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);
}

@SuppressWarnings({ "unchecked", "rawtypes" })
private void initializeToDoList() {
    // TODO Auto-generated method stub
    listItems = new ArrayList<ToDoItem>();
    listString = new ArrayList<String>();
    listAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, listString);
    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.java

public class ToDoItemAdapter extends ArrayAdapter {

private int resource; 

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

    super(context, resource, objects); // TODO Auto-generated constructor stub 
    this.resource = resource;
} 

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

    LinearLayout todoView; 
    ToDoItem todo = getItem(position); 
    String taskString = todo.getTask(); 
    String dateString = todo.getDeadline(); 
    String priorityString = todo.getPriority(); 

    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); 
    } 
    else 
    { 
        todoView = (LinearLayout) convertView; 
    } 

    TextView taskView = (TextView) todoView.findViewById(R.id.edit_text_task2); 
    TextView dateView = (TextView) todoView.findViewById(R.id.EditText02); 
    TextView priorityView = (TextView) todoView.findViewById(R.id.priority_spinner2); 
    taskView.setText(taskString); 
    dateView.setText(dateString); 
    priorityView.setText(priorityString); 
    return todoView; 
} 

}

ToDoItem.java

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;
}

}

And finally i have an EditingTask.java class that i don't know how to combine with my custom adapter...

Thank you in advance.

Upvotes: 0

Views: 1443

Answers (2)

ALANIS_RARUS
ALANIS_RARUS

Reputation: 33

To get clicked element you should use OnItemClickListener. Here is example:

list.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view,
                int position, long id) {

            MyAdapter adapter = (MyAdapter) list.getAdapter();

            String name = adapter.getItem(position).getName();

            Intent intent = new Intent(MainActivity.this, DetailActivity.class);
            intent.putExtra("name", name);
            MainActivity.this.startActivity(intent);    

        }
    });

Upvotes: 0

wvdz
wvdz

Reputation: 16651

To make an ArrayAdapter do anything beyond displaying TextViews in an updateble list, you have to subclass it. Below is an example of how you could do that.

In the getView method you can modify the view(s) of the item and set listeners.

public class CustomAdapter extends ArrayAdapter<String>
{
    private LayoutInflater inflater;
    private int resourceId;
    private List<String> data;

    public CustomAdapter(Context context, int resourceId, List<String> data)
    {
        super(context, resourceId, data);
        inflater = LayoutInflater.from(context);
        this.resourceId = resourceId;
        this.data = data;
    }

    @Override
    public View getView(int position, View view, ViewGroup parent)
    {
        if (view == null)
            view = inflater.inflate(resourceId, null);
        String data_item = (String) ((ListView) parent).getItemAtPosition(position);
        CheckBox checkBox = ((CheckBox) view.findViewById(R.id.check_box));
        // Do your thing
        return view;
    }
}

Upvotes: 0

Related Questions