2014-11-15 3 views
0

У меня возникла проблема при попытке обновить элементы в представлении списка после того, как кнопка была запущена. Вот как я заполнить ListView OnCreate:Обновить ListView Items при нажатии кнопки

public class EventChat extends Fragment { 
Context context; 
View eventChat; 

String userID, eventID; 

private ListView listview; 
public ArrayList<EventComment> _commentlist = new ArrayList<EventComment>(); 
TextView txtDisplayCommentBy, txtDisplayDateTime, txtDisplayCommentDesc, 
     txtEventChat; 

Button btnChatSubmit; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    eventChat = inflater.inflate(R.layout.event_chat, container, false); 
    context = getActivity(); 

    listview = (ListView) eventChat.findViewById(R.id.listview); 
    txtEventChat = (TextView) eventChat.findViewById(R.id.txtEventChat); 

    btnChatSubmit = (Button) eventChat.findViewById(R.id.btnChatSubmit); 
    btnChatSubmit.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      onSubmitChatClicked(); 
     } 
    }); 

    Intent i = getActivity().getIntent(); 
    _commentlist = (ArrayList<EventComment>) i 
      .getSerializableExtra("eventCommentObj"); 
    Event eventModel = (Event) i.getSerializableExtra("eventObj"); 

    userID = "Gab"; 
    eventID = eventModel.getEventID(); 

    listview.setAdapter(new ListAdapter(getActivity())); 

    return eventChat; 
} 

private class ListAdapter extends BaseAdapter { 
    LayoutInflater inflater; 
    ViewHolder viewHolder; 

    public ListAdapter(Context context) { 
     inflater = LayoutInflater.from(context); 
    } 

    public int getCount() { 
     return _commentlist.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 

      convertView = inflater.inflate(R.layout.eventchat_listview_row, 
        null); 
      viewHolder = new ViewHolder(); 
      viewHolder.txt_dcommentBy = (TextView) convertView 
        .findViewById(R.id.txtDisplayCommentBy); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.txt_dcommentBy.setText(_commentlist.get(position) 
       .getCommentBy().trim()); 
     return convertView; 
    } 
} 

private class ViewHolder { 
    TextView txt_dcommentBy; 
    TextView txt_ddateTime; 
    TextView txt_dcommentDesc; 
} 
} 

Когда моя кнопка была спровоцирована и вставить новую запись в базу данных, в то же время, я хотел список просмотреть элементы, которые будут обновилась:

public void onSubmitChatClicked() { 
    EventComment commentModel = new EventComment(); 
    String currentDate = EventDateTime.getCurrentDate(); 
    String currentTime = EventDateTime.getCurrentTime(); 
    String commentDesc = String.valueOf(txtEventChat.getText()); 
    commentModel.setCommentBy(userID); 
    commentModel.setEventID(eventID); 
    commentModel.setCommentDate(currentDate); 
    commentModel.setCommentTime(currentTime); 
    commentModel.setCommentDesc(commentDesc); 
    new CreateCommentAsyncTask(context).execute(commentModel); 

    txtEventChat.setText(""); 

} 

Однако он не обновляется. Есть идеи?

Заранее спасибо.

+0

Вы попробовали 'adapter.notifyDataSetChanged'? нажатие кнопки после последнего сохранения данных? –

+0

Но каков тип данных адаптера? –

+0

Ваш адаптер listview. –

ответ

1

Ну это выглядит довольно просто.

Сначала сделайте ваш адаптер член класса, так что вы можете получить доступ к нему позже:

private ListAdapter mAdapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    ... 
    mAdapter = new ListAdapter(getActivity(); 
    listview.setAdapter(mAdapter); 
    ... 
} 

Затем, когда вы отправляете товар, также добавить его в ArrayList и обновить адаптер:

public void onSubmitChatClicked() { 
    EventComment commentModel = new EventComment(); 
    String currentDate = EventDateTime.getCurrentDate(); 
    String currentTime = EventDateTime.getCurrentTime(); 
    String commentDesc = String.valueOf(txtEventChat.getText()); 
    commentModel.setCommentBy(userID); 
    commentModel.setEventID(eventID); 
    commentModel.setCommentDate(currentDate); 
    commentModel.setCommentTime(currentTime); 
    commentModel.setCommentDesc(commentDesc); 

    // Add the new element to your DB 
    new CreateCommentAsyncTask(context).execute(commentModel); 
    // Add the new element to your current ArrayList 
    _commentlist.add(commentModel) 
    // Update theListView, by updating the adapter 
    mAdapter.notifyDataSetChanged(); 

    txtEventChat.setText(""); 
} 

EDIT:

Немного больше объяснений:

Когда фр agment создается, вам передается массив из EventComment элементов. Я думаю, что это элементы из вашей БД. Однако при обновлении базы данных ваш ArrayList не будет обновляться, если вы не перезагрузите весь фрагмент. Вот почему вы добавляете элемент в БД и в список вручную, а с помощью notifyDataSetChanged вы вынуждаете адаптер обновлять ListView.

+0

Спасибо большое!Но не могли бы вы помочь мне прояснить, работает ли это так: когда кнопка была запущена, она добавит новую запись в статический _commentlist, а адаптер notifyDataSetChanged обновит представление списка? –

+0

@IWasSoLost см. Мое обновление ответа для немного большего объяснения. – Simas

+0

Я вижу. Большое спасибо! –

1

Вы не можете сделать listview.setAdapter(new ListAdapter(getActivity())); для достижения этой цели. Вы должны создать экземпляр adapter и вызвать adapter.add + adapter.notifyDataSetChanged

Это очень хороший учебник:

http://www.vogella.com/tutorials/AndroidListView/article.html http://www.javacodegeeks.com/2013/09/android-listview-with-adapter-example.html

+0

Извините, но не могли бы вы предоставить мне примеры кода? Потому что я не совсем понимаю его. –

+0

@IWasSoLost Done :) Возможно, вам понадобится сделать некоторые поисковые запросы, такие как «Android-браузер listview», потому что вам нужно понять, как работает адаптер. –

+0

Итак, я могу предположить, что я должен преломлять все мои коды реализовать адаптер? –

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