2015-07-23 1 views
0

Я создал индивидуальный ListView. ListView содержит информацию о каждом объекте и 2 кнопках для редактирования и удаления. Я связал его с объектом ArrayList с помощью настраиваемого ListViewAdapter для информации.Обработка событий Click List в ListView

Теперь я хочу, чтобы кнопки обновляли объект ArrayList при нажатии. Я не могу найти способ сделать это. Я следовал инструкции нашел в этой ссылке ..

http://www.migapro.com/click-events-listview-gridview/

Программа не бросать какие-либо ошибки. Но он ничего не делает. Пока что я просто хотел протестировать, бросив тост за каждую кнопку.

Код для метода ListViewAdapter.getView() является:

@Override 
public View getView(final int position, View convertView, final ViewGroup parent) { 
    ViewHolder holder; 

    // check if the view already exists 
    // if so, no need to inflate and findViewById again! 
    if (convertView == null) { 

     // Inflate the custom row layout from your XML. 
     convertView = mInflater.inflate(R.layout.list_item, null); 

     // create a new "Holder" with subviews 
     holder = new ViewHolder(); 
     holder.itemNameView = (TextView) convertView.findViewById(R.id.item_name); 
     holder.itemExpiryView = (TextView) convertView.findViewById(R.id.item_expiry); 

     // Taking care of the buttons 
     holder.editButton = (Button) convertView.findViewById(R.id.button_edit); 
     holder.editButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick() 
      } 
     }); 

     holder.deleteButton = (Button) convertView.findViewById(R.id.button_delete); 
     holder.deleteButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick() 
      } 
     }); 



     // hang onto this holder for future recycling 
     convertView.setTag(holder); 
    } else { 

     // skip all the expensive inflation/findViewById 
     // and just get the holder you already made 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    // More code after this 

    // Grab the title and author from the JSON 
    String name = ""; 
    String expiry = "7 days"; 

    // Write appropriate codes to obtain values for the string variables above 
    name = (String) getItem(position); 

    // Send these Strings to the TextViews for display 
    holder.itemNameView.setText(name); 
    holder.itemExpiryView.setText(expiry); 

    return convertView; 
} 

Я реализовал OnItemClickListener() в MainActivity и написал этот код-фрагмент для обработки щелчков кнопок.

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    long viewId = view.getId(); 

    if (viewId == R.id.button_edit) { 
     Toast.makeText(this, "Edit Button CLicked", Toast.LENGTH_SHORT).show(); 
    } else if (viewId == R.id.button_delete) { 
     Toast.makeText(this, "Delete Button CLicked", Toast.LENGTH_SHORT).show(); 
    } else { 
     Toast.makeText(this, "ListView clicked" + id, Toast.LENGTH_SHORT).show(); 
    } 
} 

Соответствующий файл макета выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" android:layout_height="match_parent"> 

<TextView 
    android:id="@+id/item_name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

<TextView 
    android:id="@+id/item_expiry" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/item_name" /> 

<Button 
    android:id="@+id/button_edit" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/item_expiry" 
    android:layout_alignParentLeft="true" 
    android:text="Edit" 
    android:clickable="true" /> 
    <!--android:onClick="editItem" />--> 

<Button 
    android:id="@+id/button_delete" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/item_expiry" 
    android:layout_alignParentRight="true" 
    android:text="Delete" 
    android:clickable="true" /> 
    <!--android:onClick="ItemEdits.deleteItem" />--> 


</RelativeLayout> 

Если вы, ребята, нужно больше кодовыми фрагменты, пожалуйста, дайте мне знать. Не удалось найти что-либо в logcat. Таким образом, не может помочь с кодом ошибки/предупреждением. Заранее большое спасибо.

Что я пытаюсь достичь здесь, так это то, что, когда я нажимаю кнопку «Редактировать/Удалить», мне нужно вызвать функцию, чтобы изменить ArrayList, сохраняя значения списка. И каким-то образом мне нужно передать позицию элемента, нажатого, чтобы я мог обновить правильную информацию. Есть ли лучший способ сделать это? Если да, то, пожалуйста, помогите мне с образцом кода.

ответ

0

Вы добавляете действие click внутри if (convertview == null). который необходимо изменить, попробуйте следующее. Это всего лишь одна проблема. попробуйте это и дайте мне знать, что может быть результатом.

@Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     ViewHolder holder; 

     // check if the view already exists 
     // if so, no need to inflate and findViewById again! 
     if (convertView == null) { 

      // Inflate the custom row layout from your XML. 
      convertView = mInflater.inflate(R.layout.list_item, null); 

      // create a new "Holder" with subviews 
      holder = new ViewHolder(); 
      holder.itemNameView = (TextView) convertView.findViewById(R.id.item_name); 
      holder.itemExpiryView = (TextView) convertView.findViewById(R.id.item_expiry); 

      // Taking care of the buttons 
      holder.editButton = (Button) convertView.findViewById(R.id.button_edit); 
      holder.deleteButton = (Button) convertView.findViewById(R.id.button_delete); 


      // hang onto this holder for future recycling 
      convertView.setTag(holder); 
     } else { 

      // skip all the expensive inflation/findViewById 
      // and just get the holder you already made 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.editButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick() 
      } 
     }); 

     holder.deleteButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick() 
      } 
     }); 

     // More code after this 

     // Grab the title and author from the JSON 
     String name = ""; 
     String expiry = "7 days"; 

     // Write appropriate codes to obtain values for the string variables above 
     name = (String) getItem(position); 

     // Send these Strings to the TextViews for display 
     holder.itemNameView.setText(name); 
     holder.itemExpiryView.setText(expiry); 

     return convertView; 
    } 

Примечание: использование OnClick внутри метода GetView или использовать метод onItemClick. Использование обоих способов приведет к возникновению некоторых проблем.

+0

Спасибо, что указал. Изменено соответственно. И да, сохраняя проблемы как OnClick, так и OnItemClick. Я попытался бы определить функции для редактирования и удаления внутри методов OnClick, а не передавать его в новую функцию OnItemClick. :) Спасибо за указание. Я могу обновить эту тему, прося дополнительную помощь. Приятно познакомиться. – Reutzesen

 Смежные вопросы

  • Нет связанных вопросов^_^