Удаление элемента из списка только удалить последний элемент, не выбранный элемент android

#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;
}
}