Пользовательский адаптер получает неправильную позицию в методе getView в ListView - PullRequest
3 голосов
/ 16 августа 2011

У меня есть список с пользовательским адаптером массива. Я хочу получить позицию клика элементов из метода getView. Я получаю несколько позиций списка, но когда я добавляю в список более 7 элементов, я получаю неправильную позицию из метода getView. Я имею в виду, когда я нажимаю 9-й элемент списка, он возвращает 1.

Вот мой код

    @Override
    public View getView(int pos, View convertView, ViewGroup parent) {

        this.position = pos;
        Log.v("View position", Integer.toString(pos));

        lineView = convertView;

            if(lineView==null)
            {
                adapterLine=new AdapterLine();
                layoutInflater=context.getLayoutInflater();
                lineView=layoutInflater.inflate(com.inomera.sanalmarket.main.R.layout.adapter, null,true);
                adapterLine.sListText = (TextView) lineView.findViewById(R.id.sListText);
                adapterLine.sListCheckbox = (CheckBox) lineView.findViewById(R.id.sListCheckbox);
                adapterLine.sListImageView = (ImageView) lineView.findViewById(R.id.imageView1);
                adapterLine.gestureOverlayView = (GestureOverlayView) lineView.findViewById(com.inomera.sanalmarket.main.R.id.gestureOverlayView1);
                adapterLine.gestureOverlayView.setGestureVisible(false);

                // To remember whitch tab is selected 
                adapterLine.sListImageView.setTag(pos);
                adapterLine.sListCheckbox.setTag(pos);
                adapterLine.sListText.setTag(pos);

                Log.v("adapter", "position of adapter is " + Integer.toString(pos));

Спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 16 августа 2011

Адаптер массива создаст только один объект на видимую строку в представлении списка.После этого адаптер перезапустит уже созданное представление.Это цель строки:

if(lineView==null)

в вашем адаптере.

Вы захотите поместить в другой раздел, который устанавливает строку, используя переработанное представление.Эта другая статья может быть полезна:

Как я могу заставить мой ArrayAdapter следовать шаблону ViewHolder?

0 голосов
/ 17 июля 2014

Эта реализация является неполной, добавьте еще раздел, который устанавливает значение из данных. вот реализация, которая работала для меня

 public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    if (convertView == null) {
        viewHolder = new ViewHolder();
        LayoutInflater inflator = reportViewContext.getLayoutInflater();
        convertView = inflator.inflate(R.layout.tabitems, null);            
        viewHolder.name= (TextView) convertView
                .findViewById(R.id.user_reportTab_userName);            
        //set other values needed in viewHolder if any
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder)convertView.getTag();
    }
    //data is list of Data model
    if(data.size()<=0) { 
        //if data unavailable } 
    else {

     /***** Get each Model object from Array list ********/
       System.out.println("Position:"+position);

     /************ Set Model values in Holder elements ***********/

        viewHolder.name.setText(data.get(position).getName());
     }       
    return convertView;
}

Я знаю, что вопрос очень старый, ответили, если кто-нибудь наткнулся на подобную проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...