如何解决从listView中删除项目只删除最后一个项目未选择的元素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",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,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;
}
}
解决方法
请尝试下面的适配器类。
我更新了 getItem
和 getView
。
正如我所看到的,您的 getItem
和 getView
直接使用了 storeMsgButtonPressedObj
,它根据您的实现保存了最后一次发送或接收消息,它不应用于创建视图或在 getItem
中,但它应该从包含这些值的 List 中提取。
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,false);
TextView tView = updateView.findViewById(R.id.textViewReceived);
tView.setText(getItem(indexValueOfElement).toString());
}
}
//return the updated view object
return updateView;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。