Как получить представление для элемента в списке в андроиде?

Возможно ли получить представление элемента на основе его положения в адаптере, а не в видимых видах в ListView?

Я знаю такие функции, как getChildAt () и getItemIdAtPosition (), однако они предоставляют информацию, основанную на видимых видах внутри ListView. Я также знаю, что Android перерабатывает представления, что означает, что я могу работать только с видимыми видами в ListView.

Моя цель состоит в том, чтобы иметь универсальный идентификатор для каждого элемента, поскольку я использую CursorAdapter, поэтому мне не нужно вычислять позицию элемента относительно видимых элементов.

Solutions Collecting From Web of "Как получить представление для элемента в списке в андроиде?"

Вот как я это сделал. В моем (пользовательском) классе адаптера:

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

По сути, трюк состоит в том, чтобы установить и получить индекс позиции с помощью методов setTag и getTag . Переменная items относится к ArrayList содержащему мои пользовательские (адаптивные) объекты.

Также см. Этот учебник для подробных примеров. Дайте мне знать, если вы хотите, чтобы я что-то разъяснил.

Пусть это будет полезно для вас. См. Ниже код:

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

Наслаждаться. Благодарю.

Лучшим вариантом является определение использования данных, возвращаемых CursorAdapter, а не видимых видов. Например, если ваши данные находятся в массиве, каждый элемент данных имеет уникальный индекс.

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

Здесь, его очень короткий описанный код, вы можете просто повторно использовать шаблон зрителя для увеличения производительности списка. Напишите ниже код в методе 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