Reputation: 83
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
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
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