从适配器重新加载 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的主要内容,如果未能解决你的问题,请参考以下文章