2013-02-26 99 views
0

我有一个使用特殊的适配器从数据库传递数据到列表视图的列表视图。但问题是,我只得到一个列表视图项目被重复,其他细节没有被显示。当我放置断点并调试项目时,所有细节都被传递给hashmap,但是listview只是反复显示一个特定的项目。代码如下所示:Android Listview项目重复

static class ViewHolder { 
    TextView txtmername,txtmerid,txtmeradd,txtmermeasure; 
    Button btnselect; 
} 



    private LayoutInflater mInflater; 

      public SpecialAdapter(Context ctx,List<HashMap<String, String>> listData, int resourceId, String[] columnTags, int[] columnIds) { 
       super(ctx, listData, resourceId, columnTags, columnIds); 
       ctx=MerchantList.this; 
       listData=listData; 
       resourceId=R.layout.merchant_listview; 
       columnTags=columnTags; 
       columnIds=columnIds; 
      } 

      @Override 
     public int getCount() { 
     return listData.size(); 
     } 

      @Override 
     public Object getItem(int position) { 
     return super.getItem(position); 
     } 

    @Override 
    public long getItemId(int position) { 
    return super.getItemId(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // A ViewHolder keeps references to children views to avoid unneccessary calls 
      // to findViewById() on each row. 
     ViewHolder holder; 
     Context con=getApplicationContext(); 

     if(convertView==null) 
      // convertView = getActivity().getLayoutInflater().inflate(R.layout.stores_listview_layout, pa 
      mInflater = (LayoutInflater)con.getSystemService(con.LAYOUT_INFLATER_SERVICE); 
      convertView=mInflater.inflate(R.layout.merchantlistview, null); 

      holder = new ViewHolder(); 
        holder.txtmername = (TextView) convertView.findViewById(R.id.lblMerchantName); 
        holder.txtmeradd=(TextView)convertView.findViewById(R.id.lblAddress); 
        holder.txtmerid=(TextView)convertView.findViewById(R.id.lblMerchantId); 
        holder.txtmermeasure=(TextView)convertView.findViewById(R.id.lblMeasure); 
        holder.btnselect=(Button)convertView.findViewById(R.id.btnSelect); 


        holder.btnselect.setOnClickListener(new View.OnClickListener() { 

        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         }); 

        convertView.setTag(holder); 
     if(convertView !=null) 
     { 
      holder=(ViewHolder)convertView.getTag(); 


     // Binding the data efficiently with the holder 

     SQLiteDatabase db=openOrCreateDatabase("NEW.db", MODE_PRIVATE, null); 
     Cursor OrderCursor = db.rawQuery("SELECT DISTINCT(A.ID), B.NAME, B.ADDRESS, A.MEASURE FROM (SELECT ID, MIN(CAST(STOCK_IN_HAND AS REAL) /REORDER_LEVEL) AS MEASURE FROM INVENTORY GROUP BY ID) A INNER JOIN MASTER B ON A.ID=B.ID ORDER BY A.MEASURE", null); 

     listData.clear(); 

     if(OrderCursor!= null) 
     { 

     if(OrderCursor.moveToFirst()){ 
       for (int i = 0; i < OrderCursor.getCount(); i++){ 


       // String first,second,third,fourth=null; 

         HashMap<String,String> map = new HashMap<String, String>(); 

         map.put(columnTags[0], OrderCursor.getString(OrderCursor.getColumnIndex("NAME"))); 
         map.put(columnTags[1], OrderCursor.getString(OrderCursor.getColumnIndex("ADDRESS"))); 
         map.put(columnTags[2], OrderCursor.getString(OrderCursor.getColumnIndex("ID"))); 
         map.put(columnTags[3], OrderCursor.getString(OrderCursor.getColumnIndex("MEASURE"))); 
         listData.add(map); 

          String measure = map.get("measure").toString(); 
          String name=map.get("Name").toString(); 
          String address=map.get("Address").toString(); 
          String id=map.get("Id").toString(); 

         holder.txtmerchantname.setText(name); 
         holder.txtmeradd.setText(address); 
         holder.txtmerid.setText(id); 
         holder.txtmermeasure.setText(measure); 
         double measure1=Double.parseDouble(measure); 

         if(measure1 > 1.5) 
         { 
          convertView.setBackgroundColor(getResources().getColor(R.color.Green)); 
         } 

         else if((1.5 >= measure1) && (measure1>1.0)) 
         { 

          convertView.setBackgroundColor(getResources().getColor(R.color.Yellow)); 
         } 

         else if(1.0>=measure1) 
         { 
          convertView.setBackgroundColor(Color.RED); 
         } 

       OrderCursor.moveToNext(); 

       }//end of for 
      } 
     OrderCursor.close(); 
     db.close(); 
    } 
     } 
     return convertView; 
    } 
    @Override 
    public int getItemViewType(int position) { 
    return super.getItemViewType(position); 
    } 
    @Override 
    public int getViewTypeCount() { 
    return super.getViewTypeCount(); 
    } 
} 
+0

将数据提取到其他位置,'getView();'用于将数据绑定到'View's。对于初学者,我建议你将数据提取代码移动到你的构造函数中,并使用'getView();'来进行绑定。 – 2013-02-26 12:23:32

+0

[自定义ListView项重复]的可能重复(http://stackoverflow.com/questions/13985240/custom-listview-items-repeated) – 2016-11-01 06:15:25

回答

0

getViewTypeCount()没有与listView项目相匹配,因此指望它增加了另一个项目。
在你的情况,我认为它关于你正在使用的measure条件。
你到底应该用else代替else if
OR
如果有另一种情况,你必须把它。