【问题标题】:Adapter returning same item twice适配器两次返回相同的项目
【发布时间】:2015-07-30 18:44:01
【问题描述】:

我有一个 ListView 持有一些项目。它显示了在数据库中搜索的结果,其中两个项目符合选择句子的条件。

当我第一次进行搜索时,它会返回两次相同的项目。但是,当我再次单击搜索按钮时,这一次就完成了,显示了这两个项目。我该怎么做才能第一次正确获取物品?

适配器:

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;

}
}

启动 SQL 语句的那段代码(在线程内):

Cursor csr=db.rawQuery(sentencia, null);
listaExpedientes=new ArrayList<BeanListaExpedientes>();
        if(csr.moveToFirst()){

                 do {
                     codficha=csr.getLong(3);
                     codexpediente=csr.getLong(15);
                     nombrecompleto=csr.getString(8);
                     nombrecomercial=csr.getString(13);

                     Cursor csr2=db.rawQuery("select path from fotos where codficha="+codficha+" LIMIT 1", null);
                     if(csr2.moveToFirst()){

                          path=csr2.getString(0);

                                            }
listaExpedientes.add(new BeanListaExpedientes(path, nombrecomercial, nombrecompleto, codexpediente, codficha));
                      }while (csr.moveToNext());
                            refreshAdapter();
                            adapter.notifyDataSetChanged();

【问题讨论】:

    标签: android android-listview android-adapter


    【解决方案1】:

    那几行

     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)

    【讨论】:

    • 除了修复第二次持有人为空的错误外,由于 UI 组件为空(已解决),您的解决方案运行良好。谢谢!我会尽可能投票。
    • 当 convertView 为空时,持有人应该始终为空。你必须调用 convertView.setTag(holder)
    【解决方案2】:

    请删除第一行中的这一行

    if(holder==null){
            holder=new ViewHolder();
        }
    

    并在 getview 中使用以下行

    LayoutInflater mInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    

    ListaExpedientesAdapter构造函数中移除这一行

    inflater=LayoutInflater.from(c);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-09
      • 2011-12-14
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多