Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

@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, содержащей мои пользовательские (адаптивные) объекты.

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

Ответ 2

Смотрите ниже код:

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

}

Ответ 3

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

Ответ 4

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



        }
    });

Ответ 5

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