好的,所以我一直在尝试让OnItemClickListener从列表项中检索值。目前正在注册点击,但价值未通过。这是我的代码的相关部分:
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 OnClick方法时,正确地执行它但只是没有获取值为空的值。有任何想法吗?感谢
答案 0 :(得分:1)
你的事情太过于复杂了
在您的主DiarySchedule活动中,您应该实现OnItemClickListener。 覆盖侦听器的onItemClick方法并在其中执行操作。 通过调用getListView()来设置监听器.setOnItemClickListener(this);在你的onCreate方法..
实施例。
public class DiarySchedule extends ListActivity implements OnItemClickListener
{
@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());
getListView().setOnItemClickListener(this); //this sets the listener
}
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3)
{
String title = ((TextView)v.findViewById(R.id.scheduleListTitle)).getText().toString();
String date = ((TextView)v.findViewById(R.id.scheduleListDate)).getText().toString();
date = GetInfoConvertToDate(date);
String time = ((TextView)v.findViewById(R.id.scheduleListTime)).getText().toString();
Intent descIntent = new Intent(DiarySchedule.this, DiaryDetailed.class);
descIntent.putExtra("title", title);
descIntent.putExtra("date", date);
descIntent.putExtra("time", time);
startActivity(descIntent);
}
}
然后,您可以删除对v.setOnClickListener的调用(new OnItemClickListener(position));在您的适配器和您为处理点击而创建的类。
当在onItemClick方法中并且您尝试使用“findViewById”时,您应该使用“v.findViewById(id);”因为您在视图“v”中搜索。
这可能是你的问题。 (并且您可以这样修复它)但我建议按照我上面描述的“正确”方式进行操作,而不是为列表视图中的每个项目设置单独的处理程序
答案 1 :(得分:1)
您有多个具有相同ID的视图(每行一个)。获取值时尝试替换
final String title = (String) ((TextView) findViewById(R.id.scheduleListTitle)).getText();
与
final String title = (String) ((TextView) v.findViewById(R.id.scheduleListTitle)).getText();
您尝试检索的其他值也是如此。