【发布时间】: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