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

Я пытаюсь создать список, который получает отмеченный список элементов, чтобы указать статус для пользователя. Мне удалось создать отображение флага, используя желтый фон (см. изображение внизу). Теоретически помеченный список может содержать много помеченных элементов. Однако в моем приложении отображаются только первые три отмеченных фона. Я считаю, что это потому, что они изначально обращены к экрану. Помеченный фон, который не изначально отображается на экране, не отображается. Я хотел бы знать, как заставить остальные флаги отображаться в списке.

Переработка ListView: Фоны в listView перерабатываются в getView(). Эта переработка идет из позиции 0 в позицию 9. У меня есть флаги, которые должны совпадать в позициях 13, 14 и так далее. Эти позиции не отображаются.

listView.getCheckedItemPositions() для множественного выбора: этот метод не будет работать в моем случае, потому что пользователь не будет выбирать флаги. Флаги приходят с сервера.

setNotifyOnChange() и/или public virtual void SetNotifyOnChange (bool notifyOnChange): я не добавляю новые данные в список, поэтому не вижу, как этот метод будет работать для моей программы. Общается ли этот метод с getview, когда он перерабатывает данные? Я не смог найти ответ на этот вопрос в своем исследовании.

public void registerDataSetObserver: это может быть излишним для моей проблемы, но возможно ли иметь объект-наблюдатель, который отслеживает все позиции в моем списке элементов и в моем списке флагов независимо от того, переработано ли представление и сопоставляется ли они на экран?

помеченные фоны с сервера
(источник: leobee.com)

Код:

package com.convention.notification.app;

import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class NewsRowAdapter extends ArrayAdapter<Item> {

    private Activity activity;
    private List<Item> items;
    private Item objBean;
    private int row;
    private List<Integer> disable;
    View view ;
    int disableView;

    public NewsRowAdapter(Activity act, int resource, List<Item> arrayList, List<Integer> disableList) {
        super(act, resource, arrayList);
        this.activity = act;
        this.row = resource;
        this.items = arrayList;
        this.disable=disableList;
        
        System.out.println("results of delete list a:"+disable.toString()); 
    
    }
    
    public int getCount() {
        return items.size();        
    }
    public Item getItem(int position) {
        return items.get(position);
    }
    public long getItemId(int position) {
        return position;
    }


        @Override
        public int getItemViewType(int position) {

        for(int k =0;k < disable.size();k++){
            if(position==disable.get(k)){
                
            //System.out.println( "is "+position+" value of disable "+disable.get(k));
                disableView=disable.get(k);
                
                //AdapterView.getItemAtPosition(position);
            } 
   
        }
              


    return position;
}
  
            @Override
            public View getView(final int position, View convertView, ViewGroup parent) {
                View view = convertView;
                ViewHolder holder;

                if (view == null) {
                    LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    view = inflater.inflate(row, null);

                    getItemViewType(position);
                    long id=getItemId(position);
                    
                    
                    if(position==disableView){ 
                        view.setBackgroundColor(Color.YELLOW);
                        System.out.println(" background set to yellow at position "+position +" disableView is at "+disableView);
                        
                        
                        }else{
                            view.setBackgroundColor(Color.WHITE);
                            System.out.println(" background set to white at position "+position +" disableView is at "+disableView);
                            
                            }
    
                    
                    //ViewHolder is a custom class that gets TextViews by name: tvName, tvCity, tvBDate, tvGender, tvAge;
                    holder = new ViewHolder();
                    
                    /* setTag Sets the tag associated with this view. A tag can be used to
                     *  mark a view in its hierarchy and does not have to be unique 
                     *  within the hierarchy. Tags can also be used to store data within
                     *   a view without resorting to another data structure.

        */
                    view.setTag(holder);
                } else {
                    
                    //the Object stored in this view as a tag
                    holder = (ViewHolder) view.getTag();
                }

                if ((items == null) || ((position + 1) > items.size()))
                    return view;

                objBean = items.get(position);


        holder.tv_event_name = (TextView) view.findViewById(R.id.tv_event_name);
        holder.tv_event_date = (TextView) view.findViewById(R.id.tv_event_date);
        holder.tv_event_start = (TextView) view.findViewById(R.id.tv_event_start);
        holder.tv_event_end = (TextView) view.findViewById(R.id.tv_event_end);
        holder.tv_event_location = (TextView) view.findViewById(R.id.tv_event_location);


        if (holder.tv_event_name != null && null != objBean.getName()
                && objBean.getName().trim().length() > 0) {
            holder.tv_event_name.setText(Html.fromHtml(objBean.getName()));
            
        }
        if (holder.tv_event_date != null && null != objBean.getDate()
                && objBean.getDate().trim().length() > 0) {
            holder.tv_event_date.setText(Html.fromHtml(objBean.getDate()));
        }
        if (holder.tv_event_start != null && null != objBean.getStartTime()
                && objBean.getStartTime().trim().length() > 0) {
            holder.tv_event_start.setText(Html.fromHtml(objBean.getStartTime()));
        }
        if (holder.tv_event_end != null && null != objBean.getEndTime()
                && objBean.getEndTime().trim().length() > 0) {
            holder.tv_event_end.setText(Html.fromHtml(objBean.getEndTime()));
        }
        if (holder.tv_event_location != null && null != objBean.getLocation ()
                && objBean.getLocation ().trim().length() > 0) {
            holder.tv_event_location.setText(Html.fromHtml(objBean.getLocation ()));
            
        }
    
        
        return view;
    }

    public class ViewHolder {
        public TextView 
        tv_event_name,
        tv_event_date,
        tv_event_start,
        tv_event_end,
        tv_event_location
        /*tv_event_delete_flag*/;
        
        
    }
    
     
}

Логкат:

06-12 20:54:12.058: I/System.out(493): item disalbed is at postion :0
06-12 20:54:12.058: I/System.out(493): item disalbed is at postion :4
06-12 20:54:12.069: I/System.out(493): item disalbed is at postion :5
06-12 20:54:12.069: I/System.out(493): item disalbed is at postion :13
06-12 20:54:12.069: I/System.out(493): item disalbed is at postion :14
06-12 20:54:12.069: I/System.out(493): item disalbed is at postion :17
06-12 20:54:12.069: I/System.out(493): results of delete list :[0, 4, 5, 13, 14, 17]
06-12 20:54:12.069: I/System.out(493): results of delete list a:[0, 4, 5, 13, 14, 17]
06-12 20:54:12.069: I/System.out(493):  set adapaer to list view called;
06-12 20:54:12.128: I/System.out(493):  background set to yellow at position 0 disableView is at 0
06-12 20:54:12.628: I/System.out(493):  background set to white at position 1 disableView is at 0
06-12 20:54:12.678: I/System.out(493):  background set to white at position 2 disableView is at 0
06-12 20:54:12.708: I/System.out(493):  background set to white at position 3 disableView is at 0
06-12 20:54:12.738: I/System.out(493):  background set to yellow at position 4 disableView is at 4
06-12 20:54:12.778: I/System.out(493):  background set to yellow at position 5 disableView is at 5
06-12 20:54:12.808: I/System.out(493):  background set to white at position 6 disableView is at 5
06-12 20:54:12.838: I/System.out(493):  background set to white at position 7 disableView is at 5

   

Это ссылка на мой первый вопрос день назад:

Изменить фон в определенной строке на основе условия в пользовательском адаптере

Я ценю вашу помощь!


person Leoa    schedule 12.06.2012    source источник


Ответы (1)


Хорошо, ответ заключался в том, что мне пришлось повторить код за пределами if(view==null) в разделе else.

if (view == null) {
                    LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    view = inflater.inflate(row, null);

                    getItemViewType(position);
                    long id=getItemId(position);


                    if(position==disableView){ 
                        view.setBackgroundColor(Color.YELLOW);
                        System.out.println(" background set to yellow at position "+position +" disableView is at "+disableView);


                        }else{
                            view.setBackgroundColor(Color.WHITE);
                            System.out.println(" background set to white at position "+position +" disableView is at "+disableView);

                            }


                    //ViewHolder is a custom class that gets TextViews by name: tvName, tvCity, tvBDate, tvGender, tvAge;
                    holder = new ViewHolder();

                    /* setTag Sets the tag associated with this view. A tag can be used to
                     *  mark a view in its hierarchy and does not have to be unique 
                     *  within the hierarchy. Tags can also be used to store data within
                     *   a view without resorting to another data structure.

        */
                    view.setTag(holder);
                } else {

                    getItemViewType(position);
                    long id=getItemId(position);


                    if(position==disableView){ 
                        view.setBackgroundColor(Color.YELLOW);
                        System.out.println(" background set to yellow at position "+position +" disableView is at "+disableView);


                        }else{
                            view.setBackgroundColor(Color.WHITE);
                            System.out.println(" background set to white at position "+position +" disableView is at "+disableView);

                            }
person Leoa    schedule 13.06.2012