问题描述
- 使用 OnItemClickListener 从 List items 中检索 null 值
-
我想获取一个 OnItemClickListener 从 list items 中检索值。现在是点击后,也不能获得值。
下面是相关的代码:public class DiarySchedule extends ListActivity implements OnClickListener { private DiaryDataSource datasource; private static final String TAG = "MAD Diary Schedule"; private String delTitle; private String delDate; private String delTime; private String editTitle; private String editDate; private String editTime; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.diary_schedule); datasource = new DiaryDataSource(this); datasource.open(); List<DiaryEntry> values = datasource.getAllDiaryEntries(); DiaryScheduleAdapter adapter = new DiaryScheduleAdapter(this,values); setListAdapter(adapter); registerForContextMenu(getListView()); } public class DiaryScheduleAdapter extends ArrayAdapter<DiaryEntry> { private LayoutInflater li; public DiaryScheduleAdapter(Context context, List<DiaryEntry> values) { super(context, 0, values); li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { DiaryEntry diaryEntry = getItem(position); View v = convertView; if ( v == null ) { v = li.inflate(R.layout.diary_schedule, null); } TextView date = (TextView)v.findViewById(R.id.scheduleListDate); String initialDate = diaryEntry.getDate(); String formattedDate = ConvertToDate(initialDate); date.setText(formattedDate); TextView link = (TextView)v.findViewById(R.id.scheduleListLink); link.setText(" at "); TextView time = (TextView)v.findViewById(R.id.scheduleListTime); time.setText(diaryEntry.getTime()); TextView title = (TextView)v.findViewById(R.id.scheduleListTitle); title.setText(diaryEntry.getTitle()); v.setOnClickListener(new OnItemClickListener(position)); return v; } } @Override public boolean onCreateOptionsMenu (Menu menu) { new MenuInflater(getApplication()).inflate(R.menu.diary_menu, menu); return (super.onCreateOptionsMenu(menu)); } @Override public boolean onOptionsItemSelected (MenuItem item) { switch (item.getItemId()) { case R.id.add: Intent intent = new Intent(DiarySchedule.this, DiaryAddEntry.class); startActivity(intent); break; } return super.onOptionsItemSelected(item); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.diary_context_menu, menu); } @Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id.edit: Intent editIntent = new Intent(DiarySchedule.this, DiaryEditEntry.class); editTitle = (String) ((TextView) info.targetView.findViewById(R.id.scheduleListTitle)).getText(); editDate = (String) ((TextView) info.targetView.findViewById(R.id.scheduleListDate)).getText(); editDate = GetInfoConvertToDate(editDate); editTime = (String) ((TextView) info.targetView.findViewById(R.id.scheduleListTime)).getText(); editIntent.putExtra("title", editTitle); editIntent.putExtra("date", editDate); editIntent.putExtra("time", editTime); startActivity(editIntent); break; case R.id.delete: delTitle = (String) ((TextView) info.targetView.findViewById(R.id.scheduleListTitle)).getText(); delDate = (String) ((TextView) info.targetView.findViewById(R.id.scheduleListDate)).getText(); delDate = GetInfoConvertToDate(delDate); delTime = (String) ((TextView) info.targetView.findViewById(R.id.scheduleListTime)).getText(); Log.v(TAG, "Hopefully title is: " + delTitle + " with date of " + delDate + " and time of " + delTime); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener) .setNegativeButton("No", dialogClickListener).show(); break; } return super.onContextItemSelected(item); } DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_POSITIVE: datasource.deleteDiaryEntry(delTitle, delDate, delTime); // IN CASE NEED TO DELETE ALL DB ENTRIES UNCOMMENT THIS // (AND COMMENT THE ABOVE METHOD) //datasource.deleteAll(); Intent intent = new Intent(DiarySchedule.this, DiarySchedule.class); startActivity(intent); break; case DialogInterface.BUTTON_NEGATIVE: // No action taken break; } } }; @Override public void onClick(View v) { // TODO Auto-generated method stub } private class OnItemClickListener implements OnClickListener { private int mPosition; OnItemClickListener(int position) { mPosition = position; } @Override public void onClick(View v) { Log.v(TAG, "onItemClick at position" + mPosition); final String title = (String) ((TextView) findViewById(R.id.scheduleListTitle)).getText(); System.out.println("Title is: " + title); String date = (String) ((TextView) findViewById(R.id.scheduleListDate)).getText(); date = GetInfoConvertToDate(date); System.out.println("Date is: " + date); final String time = (String) ((TextView) findViewById(R.id.scheduleListTime)).getText(); System.out.println("Time is: " + time); Intent descIntent = new Intent(DiarySchedule.this, DiaryDetailed.class); descIntent.putExtra("title", title); descIntent.putExtra("date", date); descIntent.putExtra("time", time); startActivity(descIntent); } } }
当调试到 OnItemClickListener 点击方法时,能顺利运行但是不能获取值,出现的是空值。什么原因啊?
解决方案
final String title = (String) ((TextView) findViewById(R.id.scheduleListTitle)).getText();
每个 都改成v.findViewById看看:
final String title = (String) ((TextView)v.findViewById(R.id.scheduleListTitle)).getText();
时间: 2024-08-30 02:25:07