#java #android #listview #listadapter
Вопрос:
У меня есть представление списка, которое я могу, которое в зависимости от нажатия кнопки заполнит представление списка и отобразит соответствующий макет. Все это прекрасно работает.
Однако то, что я сейчас пытаюсь сделать, это удалить элемент select из представления списка через окно предупреждения с помощью:
ArrayList.remove(position);
ArrayListAdapter.notifyDataSetChanged();
Что, похоже, должно сработать, и я видел другие предложения, когда гуглил, что это то, что следует называть, но вместо удаления выбранного элемента он всегда удаляет последний элемент из списка, и я не могу понять, почему?
Моя единственная мысль заключается в том, что мне нужно обработать что-то большее в моем методе getView() в моем ArrayListAdapter, расширяющем базовый адаптер, но я ни за что на свете не могу найти/выяснить, что это может быть?
Я приветствую любые предложения или мысли?
Вот мой код:
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Arrays;
public class ChatRoomActivity extends AppCompatActivity {
private ArrayList<Message> messageArrayList = new ArrayList<>(Arrays.asList());
private ArrayListAdapter messageArrayListAdapter;
private Message storeMsgButtonPressedObj;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_room);
ListView listView = findViewById(R.id.messageListView);
EditText chatMsgEditTextView = findViewById(R.id.msgBox);
listView.setAdapter(messageArrayListAdapter = new ArrayListAdapter());
Button sendButton = findViewById(R.id.sendBtn);
Button receivedButton = findViewById(R.id.receivedBtn);
sendButton.setOnClickListener(Click -> {
storeMsgButtonPressedObj = new Message(chatMsgEditTextView.getText().toString(), 1);
messageArrayList.add(storeMsgButtonPressedObj);
messageArrayListAdapter.notifyDataSetChanged();
chatMsgEditTextView.getText().clear();
});
receivedButton.setOnClickListener(Click -> {
storeMsgButtonPressedObj = new Message(chatMsgEditTextView.getText().toString(), 2);
messageArrayList.add(storeMsgButtonPressedObj);
messageArrayListAdapter.notifyDataSetChanged();
chatMsgEditTextView.getText().clear();
});
listView.setOnItemLongClickListener( (AdapterView, View, indexOfViewElement, databaseID) -> {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle("Do you want to delete this?");
alertDialogBuilder.setMessage(
"The position of your item is: " indexOfViewElement "n"
"The database id id: " databaseID
);
alertDialogBuilder.setPositiveButton("Yes", (click, arg) -> {
messageArrayList.remove(indexOfViewElement);
messageArrayListAdapter.notifyDataSetChanged();
});
alertDialogBuilder.setNegativeButton("No", (click, arg) -> { });
alertDialogBuilder.create().show();
return true;
});
}
// onCreate() END*****
private class ArrayListAdapter extends BaseAdapter {
//gets current size of array list
@Override
public int getCount(){
return messageArrayList.size();
}
@Override
public Object getItem(int indexValueOfElement){
return storeMsgButtonPressedObj.getMsgValue() /* indexValueOfElement*/;
}
@Override
public long getItemId(int indexValueOfElement){
return (long) indexValueOfElement;
}
@Override
public View getView(int indexValueOfElement, View currentView, ViewGroup parent){
View updateView = currentView;
LayoutInflater inflater = getLayoutInflater();
if(updateView == null) {
if(storeMsgButtonPressedObj.getButtonPressed() == 1) {
updateView = inflater.inflate(R.layout.row_sent, parent, false);
TextView tView = updateView.findViewById(R.id.testViewSent);
tView.setText( getItem(indexValueOfElement).toString() );
}
if(storeMsgButtonPressedObj.getButtonPressed() == 2){
updateView = inflater.inflate(R.layout.row_received, parent, false);
TextView tView = updateView.findViewById(R.id.textViewReceived);
tView.setText( getItem(indexValueOfElement).toString() );
}
}
//return the updated view object
return updateView;
}
}
}
Это класс сообщений, который я написал для хранения строки и int, чтобы определить, какая кнопка была нажата, чтобы можно было увеличить правильную компоновку.
public class Message {
private String msgValue;
private int buttonPressed;
Message(){
}
Message(String msg, int buttonPressed){
this.msgValue = msg;
this.buttonPressed = buttonPressed;
}
public String getMsgValue() {
return msgValue;
}
public int getButtonPressed() {
return buttonPressed;
}
public void setMsgValue(String msgValue) {
this.msgValue = msgValue;
}
public void setButtonPressed(int sendReceive) {
this.buttonPressed = sendReceive;
}
}
Ответ №1:
Пожалуйста, попробуйте приведенный ниже класс адаптера.
Я обновил getItem
и getView
немного. Как я вижу, вы getItem
и getView
непосредственно использовали storeMsgButtonPressedObj
то, которое удерживает последнюю отправку или получение сообщения в соответствии с вашей реализацией, оно не должно использоваться для создания представления или в getItem
, а скорее должно быть извлечено из списка, содержащего эти значения.
private class ArrayListAdapter extends BaseAdapter {
//gets current size of array list
@Override
public int getCount() {
return messageArrayList.size();
}
@Override
public Object getItem(int indexValueOfElement) {
return messageArrayList.get(indexValueOfElement);
}
@Override
public long getItemId(int indexValueOfElement) {
return (long) indexValueOfElement;
}
@Override
public View getView(int indexValueOfElement, View currentView, ViewGroup parent) {
View updateView = currentView;
LayoutInflater inflater = getLayoutInflater();
if (updateView == null) {
if (messageArrayList.get(indexValueOfElement).getButtonPressed() == 1) {
updateView = inflater.inflate(R.layout.row_sent, parent, false);
TextView tView = updateView.findViewById(R.id.testViewSent);
tView.setText(getItem(indexValueOfElement).toString());
}
if (messageArrayList.get(indexValueOfElement).getButtonPressed() == 2) {
updateView = inflater.inflate(R.layout.row_received, parent, false);
TextView tView = updateView.findViewById(R.id.textViewReceived);
tView.setText(getItem(indexValueOfElement).toString());
}
}
//return the updated view object
return updateView;
}
}