2013-02-26 141 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
如果有另一種情況,你必須把它。