Введение в проблему
В процессе обучения разработке Android я столкнулся с проблемой, которая кажется распространенной. Когда мы инициализируем и привязываем Listview к соответствующим данным Arraylist через адаптер, после обновления последующих данных теоретически с помощью адаптера.После обновления обновление ListView в представлении не могло быть завершено.Я попросил у Bing пока, но не нашел никакого решения.Наконец, я долго проверял, прежде чем понял, что происходит. . .
в заключение
Решение ① может быть наиболее эффективным решением.
Перепривязать обновленные данные данных и просмотреть ListView с помощью адаптера-адаптера,
то есть метод при вызове привязки:
data=new_data;//有数据更新
adapter=new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1,data);
listView.setAdapter(adapter);
Решение ②
Для данных типа Arraylist изменяйте только исходный объект и не можете переназначать, поскольку переназначение существенно изменяет объект, на который указывают данные, вызывая проблемы в привязке адаптера. Это также может быть условием для использования notifyDataSetChanged( ) .
data.add("123");//数据更新
//不能data=new_data;
adapter.notifyDataSetChanged();
Вам не нужно смотреть ниже
анализ кода
package com.example.test.ui.slideshow;
import static java.lang.System.out;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import com.example.test.R;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
public class SlideshowFragment extends Fragment implements View.OnClickListener {
//private Integer[] data={1,2,3,5,65,6,7,4,4,6,44,33,9,6,6,49491,85,5,6,2,25,51,25,20,2};
private String[] ori_data={
"test_keyword1","test_keyword2","test_keyword3","test_keyword4","test_keyword1"
,"test_keyword2","test_keyword3","test_keyword4","test_keyword1","test_keyword2","test_keyword3"
,"test_keyword4","test_keyword1","test_keyword2","test_keyword3","test_keyword4"};
private ArrayList<String> data = new ArrayList<>(Arrays.asList(ori_data));
private ArrayAdapter<String> adapter=null;
private ListView listView;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view =inflater.inflate(R.layout.fragment_email,container,false);
listView=(ListView) view.findViewById(R.id.list_email);
adapter=new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1,data);
listView.setAdapter(adapter);
//单击每个item进行编辑
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
edit_item(position,adapter);
}
});
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
del_item(position,adapter);
return true; // 返回true表示已经处理了长按事件,不会触发单击事件
}
});
view.findViewById(R.id.btn_add).setOnClickListener(this);
view.findViewById(R.id.btn_sync).setOnClickListener(this);
view.findViewById(R.id.btn_save).setOnClickListener(this);
view.findViewById(R.id.btn_submit).setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.btn_add){
edit_item(data.size(), adapter);
}
else if(v.getId()==R.id.btn_sync){
//从服务器将数据同步到客户端
data=load();
adapter=new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1,data);
listView.setAdapter(adapter);
Toast.makeText(getActivity(),"已成功加载",Toast.LENGTH_SHORT).show();
}
else if(v.getId()==R.id.btn_save){
save();
Toast.makeText(getActivity(),"已成功保存",Toast.LENGTH_SHORT).show();
}
else if(v.getId()==R.id.btn_submit){
}
}
private void save(){
FileOutputStream out=null;
BufferedWriter writer=null;
try{
out =getActivity().openFileOutput("test_datasave.txt", Context.MODE_PRIVATE);
writer=new BufferedWriter(new OutputStreamWriter(out));
for (String str : data) {
writer.write(str);
writer.write('\n');
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try{
if(writer!=null){
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private ArrayList<String> load(){
ArrayList<String> data=new ArrayList<>();
FileInputStream in =null;
BufferedReader reader=null;
try{
in=getActivity().openFileInput("test_datasave.txt");
reader=new BufferedReader(new InputStreamReader(in));
String line="";
while((line=reader.readLine())!=null){
data.add(line.toString());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(getActivity(),"未找到文件",Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(reader!=null){
try{
reader.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
return data;
}
//用于弹出dialog 并修改其中的某一项
private void edit_item(int postition,ArrayAdapter<String> adapter){
AlertDialog.Builder dialog=new AlertDialog.Builder(getActivity());
dialog.setTitle("编辑");
EditText editText=new EditText(getActivity());
editText.setHint("请键入新的关键词");
dialog.setView(editText);
dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final String inputText=editText.getText().toString();
if(data.size()==postition){
data.add(inputText);
}
else data.set(postition,inputText);
adapter.notifyDataSetChanged();
}
});
dialog.show();
}
//用于弹出一个dialog,用于确认删除其中的某一项
private void del_item(int postition,ArrayAdapter<String> adapter){
AlertDialog.Builder dialog=new AlertDialog.Builder(getActivity());
dialog.setTitle("删除");
dialog.setMessage("确认删除这一项?");
dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
data.remove(postition);
adapter.notifyDataSetChanged();
}
});
dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
dialog.show();
}
}