2016-10-24 4 views
0

가끔은 1000 개 이상의 레코드를 가진 안드로이드 ListView을 구현 중이다.안드로이드리스트 뷰가 나에게 맞는 위치를 제공하지 않는다.

  • 내가 데이터베이스에서 레코드를 가져 오는 오전 :

    이 내가 현재하고있는 중이 것입니다.

  • ListView 레이아웃에 하나의 버튼이 있습니다.
  • 버튼 클릭시 자동 증분으로 설정된 데이터베이스 테이블의 기본 키를 표시하고 있습니다.

문제는 :

가 나는 그것이 두 번째 행의 값을 반환 첫 번째 행에 버튼을 클릭 할 때의 내가 10 개 행이 있다고 가정 해 봅시다. 두 번째 목록 버튼을 클릭하면 세 번째 값이 반환됩니다. 목록의 마지막 버튼을 클릭하면 올바른 값을 반환합니다.

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이고 listView의 인덱스가 1에서 시작되었거나 역순으로 표시 되었습니까? –

+0

제품 ID가 모든 2000 레코드 중 하나 일 수 있으므로 데이터베이스에서 필 터링을 적용하고 있기 때문에 prod_id가 순차적이지 않기 때문에 prod_id에 위치를 지정할 수 없습니다 – Bilal

답변

0

가장 좋은 방법은 버튼 용 태그 만 설정하는 것입니다. ViewHolder 클래스에 선언

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". 그것은 적절하게 포장됩니다.

+0

대단한 일입니다 :) @konda 대단히 감사합니다. – Bilal

+0

하지만 직접 액세스 대신 태그를 설정해야하는 이유를 알고 싶습니까? – Bilal

+0

@Bilal 문제를 해결하는 데 도움이되었으므로이 대답을 정답으로 표시해야합니다. – MohanadMohie

관련 문제