2016-10-24 55 views
0

我正在實施一個android ListView有時有超過1000個記錄。Android Listview不提供我正確的位置

這是我目前在做什麼:

  • 我從數據庫中獲取記錄。
  • 我在我的ListView佈局中有一個按鈕。
  • 點擊按鈕,我只是顯示我的數據庫表的主鍵,它被設置爲自動遞增。

的問題是:

比方說,我有10行,當我點擊按鈕,在第一行返回第二行的值。當我點擊第二個列表按鈕時,它返回第三個值。如果我點擊列表中的最後一個按鈕,它會返回正確的值。

這裏是我的ListView適配器代碼:

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.res.Resources; 
import android.graphics.Typeface; 
import android.graphics.drawable.Drawable; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.List; 

import info.androidhive.navigationdrawer.R; 
import info.androidhive.navigationdrawer.activity.ProductDetailResult; 
import info.androidhive.navigationdrawer.other.SharedPreference; 
import info.androidhive.navigationdrawer.singloton_classes.ProductResultSingloton; 



public class ProductResultListAdaptor extends BaseAdapter { 
    private Activity activity; 
    Typeface custom_font; 
    String mDrawableName; 
    private LayoutInflater inflater; 

    private List<ProductResultSingloton> result_items; 
    int prod_id; 

    public ProductResultListAdaptor(Activity activity, List<ProductResultSingloton> result_items) { 
     this.activity = activity; 
     this.result_items = result_items; 
    } 

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

    @Override 
    public Object getItem(int location) { 
     return result_items.get(location); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Viewholder holder; 
     if (inflater == null) { 
      inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.products_list, null); 
      holder = new Viewholder(); 

      holder.modal  = (TextView) convertView.findViewById(R.id.prod_result_modal); 
      holder.type   = (TextView) convertView.findViewById(R.id.prod_result_type); 
      holder.observation = (TextView) convertView.findViewById(R.id.prod_result_obeservation); 
      holder.view_detail = (Button) convertView.findViewById(R.id.show_detail); 
      holder.view_detail.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(activity,Integer.toString(prod_id),Toast.LENGTH_LONG).show(); 
       } 
      }); 
      convertView.setTag(holder); 

     }else { 

      holder = (Viewholder) convertView.getTag(); 
     } 
     ProductResultSingloton m = result_items.get(position); 

     prod_id = m.getRow_id(); //Database id is set to singlton class. 
     holder.modal.setText(m.getCODIGO()); 
     holder.type.setText(m.getTIPO()); 
     holder.observation.setText(m.getOBSERVACIONES()); 

     return convertView; 
    } 

    static class Viewholder{ 
     TextView modal; 
     TextView type; 
     TextView observation; 

     Button view_detail; 

    } 
} 

任何建議/幫助表示讚賞。我困在我的項目中間。

在此先感謝。

+0

試試'prod_id = position' – Marat

+0

是不是因爲你的索引在db strat從0開始,indexView的索引從1開始,還是反向? –

+0

我不能指定位置prod_id,因爲我的prod_id不是按順序,因爲我是在數據庫中應用過濾器,所以產品ID可以是來自所有2000條記錄中的任何一個 – Bilal

回答

0

最好的方法就是設置按鈕標籤。

holder.view_detail.setTag(m.getRow_id()); 

//and when button is clicked then fetch the ID of the row from button 
holder.view_detail.getTag() 

「PROD_ID」 在ViewHolder類中聲明。它正確包裝。

+0

太棒了訣竅:)非常感謝@Konda – Bilal

+0

但是我想知道爲什麼我們需要設置標籤而不是直接訪問? – Bilal

+0

@Bilal您應該將此答案標記爲正確答案,因爲它可以幫助您解決問題。 – MohanadMohie