从列表中删除项目查看只删除最后一个项目没有选择的元素android



我有一个列表视图,根据单击的按钮,它将填充列表视图并显示适当的布局。这一切都很好。

然而,我现在要做的是通过警报窗口从列表视图中删除选择元素,使用:

ArrayList.remove(position);

ArrayListAdapter.notifyDataSetChanged();

这似乎应该起作用,我在谷歌搜索时看到了其他建议,这就是应该调用的,但它总是从ListView中删除最后一个元素,而不是删除选定的元素,我不明白为什么?

我唯一的问题是,我需要在我的ArrayListAdapter扩展baseAdapter中的getView((方法中处理更多的东西,但我一辈子都找不到/弄不清可能是什么?

我欢迎任何建议或想法?

这是我的代码:


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

这是我编写的消息类,用于存储String和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;
}
}

请尝试下面的Adapter类。

我已经稍微更新了getItemgetView。正如我所看到的,您的getItemgetView直接使用了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;
}
}

最新更新