从适配器重新加载 ListView

Posted

技术标签:

【中文标题】从适配器重新加载 ListView【英文标题】:Reload ListView from Adapter 【发布时间】:2020-09-13 21:46:56 【问题描述】:

我的应用上有一个使用适配器管理的列表视图。在适配器内部,我有一个从列表中删除项目的按钮,我的问题是,我无法立即看到更改,我必须重置活动才能刷新列表。有没有办法从适配器上的 getView 刷新数据?

活动

公共类 gestionCategorias 扩展 AppCompatActivity

private ListView listaCategorias;
private SQLAdmin sql;
private ArrayList<CategoriasModel> arrayCat;
private ImageButton delete;
private CategoriaAdapter adapter;
private EditText agregarCategoriaInput;

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

    listaCategorias = (ListView) findViewById(R.id.listaCategorias);
    arrayCat = new ArrayList<>();

    sql = new SQLAdmin(this);
    delete = (ImageButton) findViewById(R.id.eliminarCategoria);
    agregarCategoriaInput = (EditText) findViewById(R.id.agregarCategoriaInput);

    loadDataInListView();





public void loadDataInListView() 
    arrayCat = sql.getAllCategorias();
    adapter = new CategoriaAdapter(this, arrayCat);
    listaCategorias.setAdapter(adapter);
    adapter.notifyDataSetChanged();


Adapter =>(这个想法是当我点击“eliminar”按钮时刷新列表)

public class CategoriaAdapter extends BaseAdapter 

private Context context;
private ArrayList<CategoriasModel>arrayList;

public CategoriaAdapter (Context context, ArrayList<CategoriasModel>arrayList)
    this.context = context;
    this.arrayList = arrayList;



    @Override
    public View getView(final int position, View convertView, ViewGroup parent) 

        LayoutInflater inf = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inf.inflate(R.layout.categorialv , null);

        final SQLAdmin sql = new SQLAdmin(context.getApplicationContext());

        final TextView categoria_nombre = (TextView) convertView.findViewById(R.id.nombreCategoria);

        final CategoriasModel categoriasModel = arrayList.get(position);

        categoria_nombre.setText(categoriasModel.getNombre());

        ImageButton eliminar = (ImageButton)convertView.findViewById(R.id.eliminarCategoria);

        eliminar.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View v) 


                                sql.eliminarCategoria(arrayList.get(position).getId());
                                Toast.makeText(context.getApplicationContext() , "Categoria eliminada" , Toast.LENGTH_SHORT).show();
            
        );

        return convertView;
    

谢谢!

【问题讨论】:

你需要在``` eliminar.setOnClickListener```里面添加notifyDataSetChanged() @HussainAbbas 它什么也没做 您的适配器类错误您需要将此视图与列表视图绑定 也许您可以尝试在适配器中添加删除侦听器,一旦用户单击 ImageButton,它将使用侦听器通知您的活动。然后您可以删除您的活动中的项目,然后致电adapter.notifyDataSetChanged() 【参考方案1】:

我已经通过将以下代码添加到我的适配器来解决它 =>

 if (context instanceof gestionCategorias)
                    ((gestionCategorias)context).loadDataInListView();
                

LoadDataInListView 再次加载所有数据并更新列表视图。

【讨论】:

【参考方案2】:

删除项目后需要调用“notifyDataSetChanged()”。

eliminar.setOnClickListener(new View.OnClickListener() 

        @Override
        public void onClick(View v) 


                            sql.eliminarCategoria(arrayList.get(position).getId());
                            Toast.makeText(context.getApplicationContext() , 
                                "Categoria eliminada" , Toast.LENGTH_SHORT).show();
                            notifyDataSetChanged(); // refresh the list
        
    );

【讨论】:

【参考方案3】:

也许你可以试试这个,清除列表并添加新的

public void loadDataInListView() 
        arrayCat.clear();
        arrayCat = sql.getAllCategorias();
        adapter = new CategoriaAdapter(this, arrayCat);
        listaCategorias.setAdapter(adapter);
        adapter.notifyDataSetChanged();

    

【讨论】:

以上是关于从适配器重新加载 ListView的主要内容,如果未能解决你的问题,请参考以下文章

将图像从 URL 加载到 ListView

当 AsyncTask 在适配器内时刷新 ListView

重新排序 ListView 项的动画

在 ListView 的自定义适配器中从 URL 加载图像(Android Studio)

从 ListView 中的 apk 文件加载许多图标

android listview 适配器 asynctask 图像加载