2012-04-18 1 views
0

Итак, я пытаюсь получить OnItemClickListener для извлечения значений из элементов списка. В настоящий момент клик регистрируется, но значения не проходят. Here're соответствующие части моего кода:Извлечение нулевых значений из элементов списка с использованием 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

У вас есть несколько видов с одним и тем же идентификатором (по одному на каждую строку). При получении значения попробуйте заменить

final String title = (String) ((TextView) findViewById(R.id.scheduleListTitle)).getText(); 

с

final String title = (String) ((TextView) v.findViewById(R.id.scheduleListTitle)).getText(); 

То же самое для других значений, которые вы пытаетесь получить.

+0

Спасибо azertiti - это было то, чего мне не хватало, чтобы заставить его работать! –

1

Вы очень чрезмерно усложнять

в основной DiarySchedule деятельности вы должны реализовать OnItemClickListener. Переопределите метод onItemClick для слушателя и выполните свои действия там. Установите ваш слушатель, вызвав getListView(). SetOnItemClickListener (this); в вашем методе onCreate.

Ex.

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 (новый OnItemClickListener (позиция)); в вашем адаптере и классе, который вы создали для обработки кликов.

Когда в методе onItemClick и вы пытаетесь использовать «findViewById», вы должны использовать «v.findViewById (id)»; поскольку вы выполняете поиск в представлении «v».

Это, скорее всего, ваша проблема. (и вы можете исправить это как таковой), но я бы рекомендовал сделать это «правильным» способом, как я описал выше, вместо того, чтобы иметь отдельные обработчики для каждого элемента в вашем списке.

+0

Спасибо dymmeh! Я обязательно вернусь и посмотрю, чтобы обострить весь мой код с советами, подобными этому, но поскольку я нахожусь на строгом временном графике, теперь я просто работаю. Ура! –

+0

Ну, это займет у вас 2 минуты. Скопируйте то, что у меня выше, возьмите исправленный код с «v.findViewById» из вашего onclick, вставьте его в onItemClick выше .. измените mPosition на позицию, сделайте. :) Меньше + более чистый код, меньше классов, меньше накладных расходов, связанных с наличием индивидуальных кликов для каждого представления. хорошо стоит небольшое количество времени, которое требуется для изменения – dymmeh

+0

Я обновил источник, чтобы включить изменения, которые вы должны внести. теперь у вас есть 0 оправдание за его не выполнение;) – dymmeh