Android 适配器返回同一项两次
我有一个包含一些项目的列表视图。它显示数据库中搜索的结果,其中两个项目符合select语句的条件 当我第一次搜索时,它会返回两次相同的项目。但是,当我再次单击“搜索”按钮时,这一次是ok,显示两个项目。我该怎么做才能在第一次得到正确的物品 适配器:Android 适配器返回同一项两次,android,android-listview,android-adapter,Android,Android Listview,Android Adapter,我有一个包含一些项目的列表视图。它显示数据库中搜索的结果,其中两个项目符合select语句的条件 当我第一次搜索时,它会返回两次相同的项目。但是,当我再次单击“搜索”按钮时,这一次是ok,显示两个项目。我该怎么做才能在第一次得到正确的物品 适配器: public class ListaExpedientesAdapter extends BaseAdapter { private ArrayList<BeanListaExpedientes> listaExpedientes; p
public class ListaExpedientesAdapter extends BaseAdapter {
private ArrayList<BeanListaExpedientes> listaExpedientes;
private LayoutInflater inflater=null;
private Context c;
public ListaExpedientesAdapter(Context c, ArrayList<BeanListaExpedientes> lista){
this.listaExpedientes=lista;
inflater=LayoutInflater.from(c);
this.c=c;
}
@Override
public int getCount() {
return listaExpedientes.size();
}
@Override
public Object getItem(int position) {
return listaExpedientes.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
convertView=inflater.inflate(R.layout.search_exp_adapter_layout, null);
holder=new ViewHolder();
holder.numexp=(TextView)convertView.findViewById(R.id.textnumexp);
holder.nombrecomercial=(TextView)convertView.findViewById(R.id.textnombrecomercial);
holder.nombrecompleto=(TextView)convertView.findViewById(R.id.textnombrecompleto);
holder.foto=(ImageView)convertView.findViewById(R.id.searchfoto);
holder.codficha=(TextView)convertView.findViewById(R.id.textviewcodficha);
holder.numexp.setText(String.valueOf(listaExpedientes.get(position).getNumexp()));
holder.nombrecompleto.setText(String.valueOf(listaExpedientes.get(position).getNombrecompleto()));
holder.nombrecomercial.setText(String.valueOf(listaExpedientes.get(position).getNombrecomercial()));
holder.foto.setImageBitmap(Bitmap.createScaledBitmap(BitmapFactory.decodeFile(listaExpedientes.get(position).getFoto()),dpToPx(80), dpToPx(80), true));
holder.codficha.setText(String.valueOf(listaExpedientes.get(position).getCodficha()));
}else{
holder = (ViewHolder) convertView.getTag();
}
if(holder==null){
holder=new ViewHolder();
}
return convertView;
}
private int dpToPx(int dp)
{
float density = c.getResources().getDisplayMetrics().density;
return Math.round((float)dp * density);
}
static class ViewHolder{
TextView numexp;
TextView nombrecompleto;
TextView nombrecomercial;
ImageView foto;
TextView codficha;
}
}
公共类ListaExpedienteAdapter扩展BaseAdapter{
私有ArrayList ListaExpedients;
专用充气机=空;
私有上下文c;
公共列表ExpedienteSadapter(上下文c,数组列表A){
this.listaexpedients=lista;
充气机=来自(c)的充气机;
这个.c=c;
}
@凌驾
public int getCount(){
返回listaexpedients.size();
}
@凌驾
公共对象getItem(int位置){
返回listaexpedients.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=充气机。充气(R.layout.search\u exp\u adapter\u layout,null);
holder=新的ViewHolder();
holder.numexp=(TextView)convertView.findViewById(R.id.textnumexp);
holder.nombrecomeral=(TextView)convertView.findViewById(R.id.textNombrecomeral);
holder.nombrecompleto=(TextView)convertView.findViewById(R.id.textnombrecompleto);
holder.foto=(ImageView)convertView.findViewById(R.id.searchfoto);
holder.codficha=(TextView)convertView.findViewById(R.id.textviewcodficha);
holder.numexp.setText(String.valueOf(listaexpedients.get(position.getNumexp());
holder.nombrecompleto.setText(String.valueOf(listaexpedients.get(position.getNombrecompleto());
holder.nombrecomeral.setText(String.valueOf(listaexpedients.get(position.getnombrecomeral());
holder.foto.setImageBitmap(Bitmap.createScaledBitmap(BitmapFactory.decodeFile(listaExpedientes.get(position.getFoto()),dpToPx(80),dpToPx(80),true));
holder.codficha.setText(String.valueOf(listaexpedients.get(position.getCodficha());
}否则{
holder=(ViewHolder)convertView.getTag();
}
if(holder==null){
holder=新的ViewHolder();
}
返回视图;
}
专用int dpToPx(int dp)
{
浮动密度=c.getResources().getDisplayMetrics().density;
返回数学圆((浮点)dp*密度);
}
静态类视窗夹{
文本视图numexp;
文本视图nombrecompleto;
TextView-nombrecomerical;
图像视图foto;
TextView codficha;
}
}
启动SQL语句的代码段(在线程内部):
Cursor csr=db.rawQuery(判决,空);
listaexpedients=newarraylist();
if(csr.moveToFirst()){
做{
codficha=csr.getLong(3);
codexpedinte=csr.getLong(15);
nombrecompleto=csr.getString(8);
nombrecomerical=csr.getString(13);
光标csr2=db.rawQuery(“从fotos中选择路径,其中codficha=“+codficha+”LIMIT 1”,null);
if(csr2.moveToFirst()){
path=csr2.getString(0);
}
添加(新的BeanListFacilites(路径、Nombrecomeral、nombrecompleto、CodeExpedinte、codficha));
}while(csr.moveToNext());
刷新适配器();
adapter.notifyDataSetChanged();
那些行
holder.numexp.setText(String.valueOf(listaExpedientes.get(position).getNumexp()));
holder.nombrecompleto.setText(String.valueOf(listaExpedientes.get(position).getNombrecompleto()));
holder.nombrecomercial.setText(String.valueOf(listaExpedientes.get(position).getNombrecomercial()));
holder.foto.setImageBitmap(Bitmap.createScaledBitmap(BitmapFactory.decodeFile(listaExpedientes.get(position).getFoto()),dpToPx(80), dpToPx(80), true));
holder.codficha.setText(String.valueOf(listaExpedientes.get(position).getCodficha()));
跳出if/else逻辑。您的getView
至少被调用getCount
次,但只有一次调用convertView=null
编辑
初始化
holder
后,当convertView
为空时,不要忘记调用convertView.setTag(holder)
请删除此行的第一行
if(holder==null){
holder=new ViewHolder();
}
并在getview中使用以下行
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
从listaexpedientesdapter
构造函数中删除此行
inflater=LayoutInflater.from(c);
除了修复holder第二次为null的错误外,由于UI组件为null(已解决),您的解决方案工作得非常好。谢谢!如果可以,将进行upvote。convertView为null时holder应始终为null。您必须调用convertView.setTag(holder)
inflater=LayoutInflater.from(c);