java - 无法从 AlertDialog 访问 ArrayAdapter

标签 java android listview android-arrayadapter

TL;DR

我不明白如何从对话框更改我的 ArrayList 数据集,以便它更新我的 ListView 。我当前的解决方案崩溃了,因为 ListView 没有更新。需要知道我的代码哪里出了问题。

问题

我有一个 Activity ,其中包含项目的 ListView,并通过 ArrayAdapter 将其连接到我的数据 (ArrayList)。当用户单击该列表中的某个项目时,我会加载一个 AlertDialog,允许用户删除该项目。调试显示该项目确实从数据中删除,对话框按预期关闭,但 ListView 未更新,后续单击会导致应用程序崩溃。

问题似乎与 itemsList.notifyDataSetChanged(); 相关。我尝试点击适配器,但适配器本身无法解析。

我知道这是由于我的错误造成的,但我找不到哪里出错了。

代码

ScannerActivity.java

import android.content.Intent;
import android.graphics.pdf.PdfDocument;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class ScannerActivity extends AppCompatActivity {

Button delete, deleteAll, manual, export, newPull;
EditText input_main;
static int pulls = 001;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scanner);


    //Load some items for testing
    final PullSheet pullSheet = new PullSheet();
    pullSheet.createSheet(nameText, roleText, storeText, runitText);
    pullSheet.addItem("12543", 5);
    pullSheet.addItem("3526", 1);
    pullSheet.addItem("00045", 3);
    pullSheet.addItem("95462", 18);
    pullSheet.addItem("1181", 53);
    pullSheet.addItem("6543", 1);

    final ArrayAdapter<PullItem> itemAdapter =
            new ArrayAdapter<PullItem>(this, 0, pullSheet.SheetItems) {
                @Override
                public View getView(int position,
                                    View convertView,
                                    ViewGroup parent){
                    PullItem currentItem = getItem(position);//

                    if(convertView == null) {
                        convertView = getLayoutInflater()
                                .inflate(R.layout.item, null, false);
                    }

                    TextView itemSku =
                            (TextView)convertView.findViewById(R.id.item_sku);
                    TextView itemQty =
                            (TextView)convertView.findViewById(R.id.item_qty);

                    itemSku.setText(currentItem.sku);
                    itemQty.setText(String.valueOf(currentItem.qty));

                    return convertView;
                }
            };

    final ListView itemsList = (ListView) findViewById(R.id.itemsList);
    itemsList.setAdapter(itemAdapter);

    itemsList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(final AdapterView<?> itemAdapter,
                                View view, int position, long rowId) {

            final PullItem item = pullSheet.SheetItems.get(position);
            final PullSheet sheet = pullSheet;

            //load dialog
            final AlertDialog.Builder mBuilder = new AlertDialog.Builder(ScannerActivity.this);
            final View mView = getLayoutInflater().inflate(R.layout.dialog_interact, null);

            //Declare dialog ui elements
            Button mYes = (Button) mView.findViewById(R.id.btnYes);
            Button mNo = (Button) mView.findViewById(R.id.btnNo);
            TextView skuData = (TextView) mView.findViewById(R.id.skuData);
            TextView qtyData = (TextView) mView.findViewById(R.id.qtyData);

            skuData.setText(item.sku);
            qtyData.setText(item.qty.toString());


            mBuilder.setView(mView);
            final AlertDialog dialog = mBuilder.create();
            dialog.show();

            mYes.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    deletePullItem(sheet, item);
                    itemsList.notifyDataSetChanged();// This isn't working, "Cannot resolve method notifyDataSetChanged()"
                    dialog.dismiss();
                }
            });
            mNo.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
        }
    });
    }

    public void deletePullItem(PullSheet sheet, PullItem item)
    {
        sheet.removeItem(item);
    }

} 

PullSheet.java

import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.UUID;

public class PullSheet extends Application{

protected String pullerName;
protected String role;
protected String store;
protected String sheetId;
protected String runItId;
protected Long startTime = System.currentTimeMillis();
protected ArrayList<PullItem> SheetItems = new ArrayList<PullItem>();


public void createSheet(String _pullerName, String _role, String _store, String _runItId){
    setPullerName(_pullerName);
    setRole(_role);
    setStore(_store);
    setRunItId(_runItId);
    setSheetId();
}

protected void addItem(String sku, Integer qty){
    SheetItems.add(new PullItem(sku, qty));
}
protected void removeItem(PullItem item){
    this.SheetItems.remove(item);
}

//Getters and setters

public String getPullerName(){ return pullerName; }
public String getRole(){
    return role;
}
public String getStore(){
    return store;
}
public String getRunItId(){
    return runItId;
}
public String getSheetId(){
    return sheetId;
}
public Long getStartTime(){
    return startTime;
}


private void setPullerName(String _pullerName){ pullerName = _pullerName; }
private void setRole(String _role){ pullerName = _role; }
private void setStore(String _store){ store = _store; }
private void setRunItId(String _runItId){ runItId = _runItId; }

private void setSheetId(){
    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
    String dateString = formatter.format(new Date(startTime));

    UUID uuid = UUID.randomUUID();
    String randUUID = uuid.toString();

    sheetId = dateString + "-" + this.pullerName + "-" + randUUID + "-" + runItId;

  }
}

PullItem.java

public class PullItem {

    protected String sku;
    protected Integer qty;

    public PullItem(String sku, Integer qty) {
        setSku(sku);
        this.qty = 1;
    }


    String getSku(){ return sku; }
    Integer getQty(){ return qty; }

    void setSku(String _sku){ sku = _sku; }
    void setQty(Integer _qty){ qty = _qty; }
    void incrementQty(){ qty += 1; }
}

解决方案

我需要被告知我哪里出错了。我知道它与 ArrayAdapter 和 ListView 有关,但我尝试过的所有操作都只是将“无法解析”移动到表达式的另一部分。

预先感谢您的帮助

最佳答案

notifyDatasetChanged() 是一个 Adapter 方法,因此不能将其与 ListView 一起使用

但这应该有效:

将您的适配器设为成员变量(按照您的方式实例化它),以便您可以在 Activity 中的任何位置访问它:

private ArrayAdapter<PullItem> itemAdapter;

如果用户单击“确定”按钮,只需调用deletePullItem():

mYes.setOnClickListener(new View.OnClickListener() {   
   @Override
   public void onClick(View v) {
        deletePullItem(sheet, item);
        dialog.dismiss();
   }
});

并在真正删除项目时调用notifyDatasetChanged():

public void deletePullItem(PullSheet sheet, PullItem item)
{
    sheet.removeItem(item);
    itemAdapter.notifyDatasetChanged();
}

关于java - 无法从 AlertDialog 访问 ArrayAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45108627/

相关文章:

java - 使用 Dagger 2 进行共享首选项管理

Java - LinkedList 的自动垃圾回收是如何工作的?

java - jsch-->无法使用java从unix跳转服务器连接到另一个unix服务器

android - 如何在android中的listview中删除复选框的焦点

.net - WinForms ListView : How to specify width of a ListViewItem when there are columns but in View. 列表显示模式?

java - LayoutWrappingEncoder 的 LogBack 默认字符集?

AsyncTask 类中的 Android Intent 给出错误

android - 来自多个表的 SugarORM 查询?

Android ToggleButton 自定义样式未应用

c# - 获取 ListView 中对象的数据库 ID 并从用户控件 ListView 更新 ListView