[Registro de error] En Android, notifyDataSetChanged() no puede actualizar correctamente el problema listView

Introducción al problema

En el proceso de aprender a desarrollar Android, encontré un problema que parece ser común. Cuando inicializamos y vinculamos Listview a los datos de Arraylist correspondientes a través del adaptador, después de que los datos posteriores se actualizan, teóricamente usando el adaptador. Después de la actualización, la actualización de ListView en la vista no se pudo completar. Le pedí a Bing un mientras pero no encontré ninguna solución. Finalmente, revisé durante mucho tiempo antes de entender lo que estaba pasando. . .

en conclusión

La solución ① puede ser la solución más efectiva:
volver a vincular los datos actualizados y ver ListView con el adaptador del adaptador,
es decir, llamar al método de vinculación:

data=new_data;//有数据更新
adapter=new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1,data);
listView.setAdapter(adapter);

Solución ②Para
los datos del tipo Arraylist, solo modifique el objeto original y no pueda reasignarlo, porque la reasignación esencialmente cambia el objeto al que apuntan los datos, causando problemas en el enlace del adaptador, lo que también puede ser una condición para el uso de notifyDataSetChanged() .

data.add("123");//数据更新
//不能data=new_data;
adapter.notifyDataSetChanged();

No necesitas mirar abajo

análisis de código

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();
    }
}

Supongo que te gusta

Origin blog.csdn.net/m0_56662453/article/details/131775969
Recomendado
Clasificación