2012-01-01 45 views
11

Có thể xem chế độ xem mục dựa trên vị trí của nó trong bộ điều hợp và không có trong chế độ xem hiển thị trong ListView không?Cách tải chế độ xem cho một mục trong chế độ xem danh sách trong Android?

Tôi biết các hàm như getChildAt() và getItemIdAtPosition() tuy nhiên chúng cung cấp thông tin dựa trên các khung nhìn hiển thị bên trong ListView. Tôi cũng biết rằng Android tái chế lượt xem có nghĩa là tôi chỉ có thể làm việc với các chế độ xem hiển thị trong ListView.

Mục tiêu của tôi là có số nhận dạng chung cho mỗi mục vì tôi đang sử dụng CursorAdapter vì vậy tôi không phải tính toán vị trí của mục so với các mục hiển thị.

Trả lời

1

Tùy chọn tốt hơn là xác định bằng cách sử dụng dữ liệu được trả về bởi CursorAdapter chứ không phải là chế độ xem hiển thị. Ví dụ: nếu dữ liệu của bạn nằm trong Mảng, mỗi mục dữ liệu có một chỉ mục duy nhất.

+0

() Có bất kỳ chức năng đặc biệt mà tôi co thể sử dụng? Tôi đọc toàn bộ danh sách các hàm CursorAdapter nhưng không có hàm nào trong số chúng dường như có được khung nhìn dựa trên id ngoài getView() mà không được khuyến nghị sử dụng bên ngoài. –

+0

Cấu trúc dữ liệu bạn đang sử dụng để điền danh sách là gì? –

+0

Tôi điền danh sách từ cơ sở dữ liệu Sqlite qua CursorAdapter –

8

Đây là cách tôi thực hiện việc này. Trong tôi lớp (tùy chỉnh) adapter:

@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; 
} 

Về cơ bản các trick là để thiết lập và lấy chỉ số vị trí thông qua setTaggetTag phương pháp. Biến số items đề cập đến các ArrayList chứa các đối tượng tùy chỉnh (bộ điều hợp) của tôi.

Cũng xem hướng dẫn chi tiết về this. Hãy cho tôi biết nếu bạn cần tôi làm rõ bất cứ điều gì.

+0

Tôi nghĩ về cách tiếp cận này. Trong CursorAdapter bindView thay thế getView, tôi đã cố gắng thiết lập một thẻ cho mỗi khung nhìn bằng cách sử dụng mã này: id.setText (cursor.getString (cursor.getColumnIndexOrThrow ("id"))); tuy nhiên, vì lý do nào đó, id là mọi số khác thay vì liên tục. Dù sao, tôi sẽ xem xét mã của tôi dựa trên ví dụ bạn đã cung cấp. –

3

Có thể hữu ích cho bạn. Xem bên dưới mã:

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; 
    } 

} 

Thưởng thức. Cảm ơn.

0

Ở đây, mã được mô tả rất ngắn của nó, bạn có thể đơn giản mô hình tái sử dụng viewholder để tăng hiệu suất listview Viết dưới mã trong getview bạn phương pháp

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(); 
      } 



     } 
    }); 
Các vấn đề liên quan