2012-01-01 25 views
11

ListViewの表示可能なビューではなく、アダプタ内の位置に基づいてアイテムビューを取得できますか?アンドロイドのlistviewでアイテムの表示を取得するには?

私は、getChildAt()やgetItemIdAtPosition()などの機能を認識していますが、ListView内の表示可能なビューに基づいて情報を提供しています。私はまた、AndroidはListViewの可視ビューでしか動作できないことを意味するビューをリサイクルすることに気付いています。

私の目的は、私がCursorAdapterを使用しているので、アイテムごとにユニバーサル識別子を持たせることです。そのため、表示アイテムに対するアイテムの位置を計算する必要はありません。

答えて

1

より良いオプションは、可視のビューではなくCursorAdapterによって返されたデータを使用して識別することです。 たとえば、データが配列内にある場合、各データ項目には一意のインデックスがあります。

+0

にコードの下に書く私の任意の特定の機能があります使える?私はCursorAdapter関数の全リストを読んでいますが、外部からの使用はお勧めしないgetView()とは別に、idに基づいてビューを取得するように見えるものはありません。 –

+0

リストを作成するために使用しているデータ構造は何ですか? –

+0

CursorAdapterを通じてSqliteデータベースからリストを取り込みます。 –

8

これは私がこれを達成した方法です。私の(カスタム)アダプタクラス内:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 
    LayoutInflater inflater = context.getLayoutInflater(); 
    view = inflater.inflate(textViewResourceId, parent, false); 
    final ViewHolder viewHolder = new ViewHolder(); 
    viewHolder.name = (TextView) view.findViewById(R.id.name); 
    viewHolder.button = (ImageButton) view.findViewById(R.id.button); 

    viewHolder.button.setOnClickListener 
     (new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
     int position = (int) viewHolder.button.getTag(); 
     Log.d(TAG, "Position is: " +position); 
     } 
    }); 

    view.setTag(viewHolder); 
    viewHolder.button.setTag(items.get(position)); 

    } else { 
    view = convertView; 
    ((ViewHolder) view.getTag()).button.setTag(items.get(position)); 
    } 


    ViewHolder holder = (ViewHolder) view.getTag(); 

    return view; 
} 

基本的にトリックがsetTaggetTag方法を介して位置インデックスを設定および取得することです。 items変数は、自分のカスタム(アダプタ)オブジェクトを含むArrayListを指します。

詳しくは、thisチュートリアルを参照してください。あなたが何かを明確にするために私を必要とするかどうかを教えてください。

+0

私はこのアプローチを考えました。 CursorAdapterでは、bindViewがgetViewに代わるので、私はこのコードを使って各ビューのタグを設定しようとしました:id.setText(cursor.getColumnIndexOrThrow( "id")));しかし、何らかの理由でIDは連続しているのではなく、他のすべての番号になっていました。とにかく、あなたが提供した例に基づいて私のコードを見直します。 –

3

あなたに役立つかもしれません。 下記のコードを参照してください:

public static class ViewHolder 
{ 
    public TextView nm; 
    public TextView tnm; 
    public TextView tr; 
    public TextView re; 
    public TextView membercount; 
    public TextView membernm; 
    public TextView email; 
    public TextView phone; 
    public ImageView ii; 
} 
class ImageAdapter extends ArrayAdapter<CoordinatorData> 
{ 
    private ArrayList<CoordinatorData> items; 
    public FoodDriveImageLoader imageLoader; 
    public ImageAdapter(Context context, int textViewResourceId,ArrayList<CoordinatorData> items) 
    { 
     super(context, textViewResourceId, items); 
     this.items = items; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View v = convertView; 
     ViewHolder holder = null; 
     if (v == null) 
     { 
      try 
      { 
       holder=new ViewHolder(); 
       LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       imageLoader = new FoodDriveImageLoader(FoodDriveModule.this); 
       v = vi.inflate(R.layout.virtual_food_drive_row, null); 
       //System.out.println("layout is null......."); 
       holder.nm = (TextView) v.findViewById(R.id.name); 
       holder.tnm = (TextView) v.findViewById(R.id.teamname); 
       holder.tr = (TextView) v.findViewById(R.id.target); 
       holder.re = (TextView) v.findViewById(R.id.received); 
       holder.membercount = new TextView(FoodDriveModule.this); 
       holder.membernm = new TextView(FoodDriveModule.this); 
       holder.email = new TextView(FoodDriveModule.this); 
       holder.phone = new TextView(FoodDriveModule.this); 
       holder.ii = (ImageView) v.findViewById(R.id.icon); 

       v.setTag(holder); 
      } 
      catch(Exception e) 
      { 
       System.out.println("Excption Caught"+e); 
      } 
     } 
     else 
     { 
      holder=(ViewHolder)v.getTag(); 
     } 
     CoordinatorData co = items.get(position); 
     holder.nm.setText(co.getName()); 
     holder.tnm.setText(co.getTeamName()); 
     holder.tr.setText(co.getTarget()); 
     holder.re.setText(co.getReceived()); 
     holder.ii.setTag(co.getImage()); 

     imageLoader.DisplayImage(co.getImage(), FoodDriveModule.this , holder.ii); 

     if (co != null) 
     { 
     } 
     return v; 
    } 

} 

お楽しみください。おかげさまで ここで

0

、リストビューのパフォーマンスを向上させるために、その非常に短い記述されたコードは、することができ、簡単な再利用viewholderパターンが あなたのgetViewメソッド()メソッド

ViewHolder holder = new ViewHolder(); 
    if (convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.skateparklist, null); 
     holder = new ViewHolder(); 

     holder.headlineView = (TextView) convertView 
       .findViewById(R.id.textView1); 
     holder.DistanceView = (TextView) convertView 
       .findViewById(R.id.textView2); 
     holder.imgview = (NetworkImageView) convertView 
       .findViewById(R.id.imgSkatepark); 
     convertView.setTag(holder); //PLEASE PASS HOLDER AS OBJECT PARAM , CAUSE YOU CAN NOY PASS POSITION IT WILL BE CONFLICT Holder and Integer can not cast 
     //BECAUSE WE NEED TO REUSE CREATED HOLDER 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

// your controls/UI setup 
    holder.DistanceView.setText(strDistance); 
    ...... 
    return convertview 
1
Listview lv = (ListView) findViewById(R.id.previewlist); 

    final BaseAdapter adapter = new PreviewAdapter(this, name, age); 

    confirm.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 


      View view = null; 

      String value; 
      for (int i = 0; i < adapter.getCount(); i++) { 

       view = adapter.getView(i, view, lv); 

       Textview et = (TextView) view.findViewById(R.id.passfare); 


       value=et.getText().toString(); 

       Toast.makeText(getApplicationContext(), value, 
       Toast.LENGTH_SHORT).show(); 
      } 



     } 
    }); 
関連する問題