【问题标题】:ListView is not filled with dataListView 没有填充数据
【发布时间】:2020-01-07 11:40:18
【问题描述】:

在此应用程序中,数据被插入到编辑文本中。然后,当您按下回车键时,应用程序会检查插入的数据是否存在于文本文件中。如果是,则将文本文件中的信息拆分并添加到列表视图中。

主要操作有效,但列表视图未填充数据。

我尝试将listView.setAdapter(adapter)onCreate 方法更改为enterKey 侦听器内部。当我这样做时,列表视图被填充,但总是使用相同的数据。

public class Main4Activity extends AppCompatActivity{

    private static final String TAG = "Main4Activity";

    ListView listView;

    Boolean scanOpenStatus;

    EditText editText4;

    SimpleAdapter adapter;

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

        editText4 = (EditText) findViewById(R.id.editTextCodigo);

        listView = findViewById(R.id.listViewXML);
        final List<HashMap<String, String>> listagem = new ArrayList<>();
        adapter = new SimpleAdapter(this, listagem, R.layout.layoutlist, new String[] {"Principal", "Sub"}, new int[] {R.id.textViewListViewMain, R.id.textViewListViewSub});
        final HashMap<String, String> dados = new HashMap<>();
        listView.setAdapter(adapter);
        listView.setFocusable(false);
        listView.setItemsCanFocus(false);

        editText4.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                boolean check = false;

                if ((keyCode == KeyEvent.KEYCODE_ENTER) &&
                        (event.getAction() == KeyEvent.ACTION_DOWN)) {

                    String codigoLido = editText4.getText().toString().trim();
                    editText4.setText("");

                    if (!codigoLido.equals("")) {
                        try {

                            File caminhoTxt = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/lookupscangs1.txt");

                            if (caminhoTxt.exists()) {

                                try {

                                    String line;
                                    FileReader fileReader = new FileReader(caminhoTxt);
                                    BufferedReader buffer = new BufferedReader(fileReader);

                                    while ((line = buffer.readLine()) != null) {
                                        String[] codDesc = line.split(";");
                                        String codigo = codDesc[0];
                                        String descricao = codDesc[1];

                                        if (codigo.equals(codigoLido)) {

                                            dados.put("Principal", codigoLido);
                                            dados.put("Sub", descricao);
                                            listagem.add(dados);
                                            check = true;
                                            break;
                                        }
                                    }

                                    dados.put("Principal", codigoLido);
                                    dados.put("Sub", "Código Não Cadastrado!");
                                    listagem.add(dados);
                                    check = true;
                                }

                                catch (Exception e) {
                                    Toast.makeText(getApplicationContext(), "Catch 01: " + (CharSequence) e, Toast.LENGTH_SHORT).show();

                                }

                            }

                        } catch(Exception e){
                            Toast.makeText(getApplicationContext(), "Catch 02: " + e, Toast.LENGTH_SHORT).show();
                        }
                    }
                    else {
                        Toast.makeText(getApplicationContext(), "Insira um Código!", Toast.LENGTH_SHORT).show();
                        check = false;
                    }
                }
                editText4.requestFocus();
                return check;
            }

        });

    }

}

【问题讨论】:

  • 首先,您总是添加一个看起来像“未找到凭据”的项目,而有人会认为您只想在确实未找到凭据时才添加它。其次,您使用相同的临时变量 dados 来填充您的列表,只是挂起它的数据。结果,您的列表中充满了对 dados 的引用。我不认为 List.add() 会复制对象,它只是存储引用。修复它的一种方法是在编辑内容之前执行 dados=new Hashmap() 。这将分配一个新变量,而您的列表仍然可以访问旧变量。第三是通知您的 ListView 数据已按照其他人所说的那样更改

标签: java android listview hashmap


【解决方案1】:

两种方法都可以解决这个问题

adapter.notifyDataSetChanged();

或者

adapter = new SimpleAdapter(this, listagem, R.layout.layoutlist, new String[] {"Principal", "Sub"}, new int[] {R.id.textViewListViewMain, R.id.textViewListViewSub};listView.setAdapter(adapter);

在底部的 try 块中。

【讨论】:

  • 你好阿南德。感谢您的回答。实际上,将适配器放在 try 块中是有效的!但是列表视图中的所有项目都变得相同。例如。如果我在列表中插入“Hello”,那么“Hello”就会出现在列表中。接下来,如果我插入“Hi”,列表中不会出现“Hello”和“Hi”,而是显示“Hi”和“Hi”。继续这个例子,接下来如果我插入“Bye”,它将显示“Bye”、“Bye”、“Bye”。我不明白为什么......
【解决方案2】:

您是否尝试过手动更新显示

adapter.notifyDataSetChanged();

【讨论】:

  • 是的,我做到了。没有成功。
  • 你在哪里添加了 adapter.notifyDataSetChanged();行吗?
  • 你好乔伊。我将 notifyData 放在 onCreate 块中。有错吗?
  • @Vhox 是的,这是错误的。每次更改后数据发生更改时,您都需要通知适配器更改的数据。更改发生在您的 onKey 事件中,而不是在您的 onCreate 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2011-11-15
相关资源
最近更新 更多