2014-09-02 5 views
1

У меня есть массив. Я перечисляю элементы с этим.Адаптер обновления от другого метода

Мой код:

static class ViewHolder { 
     TextView nameView; 
     ImageView imageView; 
     BadgeView badge; 
    } 
    public void placeRandomUsers(final String search) { 
     randomAdapter = new ArrayAdapter<JsonObject>(this, 0) { 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       ViewHolder holder; 
       if (convertView == null) { 
        convertView = getLayoutInflater().inflate(R.layout.random_bars, null); 
        holder = new ViewHolder(); 
        holder.nameView=(TextView)convertView.findViewById(R.id.tweet); 
        holder.badge = new BadgeView(getContext(), holder.nameView); 
        holder.badge.setTextColor(Color.WHITE); 
        holder.badge.setBadgeBackgroundColor(Color.parseColor("#FF0019")); 
        holder.imageView=(ImageView)convertView.findViewById(R.id.image); 
        convertView.setTag(holder); 
       } else { 
        holder = (ViewHolder) convertView.getTag(); 
       } 
       if (position >= getCount() - 3 && search.equals("") == true) { 
        loadRandomUsers(""); 
       } 
       JsonObject user=getItem(position); 
       String name=user.get("name").getAsString(); 
       String image_url="http://dd.com/profile/thumb/"+user.get("photo").getAsString(); 

       holder.nameView.setText(name); 


       Ion.with(holder.imageView) 
       .placeholder(R.drawable.twitter) 
       .load(image_url); 
       holder.badge.setText("1"); 
       holder.badge.hide(); 
       return convertView; 
      } 
     }; 

     ListView listView = (ListView)findViewById(R.id.list); 
     listView.setAdapter(randomAdapter); 
} 

Как вы можете видеть, я нагружение badge.But значок не виден, я хочу, чтобы показать его из другого метода для конкретного элемента.

Пример: randomAdapter(position_id).holder.badge.show(); Я хочу код, подобный этому. Как я могу это сделать?

ответ

0

Попробуйте это (не проверено) код:

int visiblePosition = position_id - listView.getFirstVisiblePosition(); 
View rowView = listView.getChildAt(visiblePosition); 
if (rowView != null) { 
    ViewHolder holder = (ViewHolder) rowView.getTag(); 
    holder.badge.show(); 
} else { 
    //Sorry the row is not visible 
} 

UPDATE: это работает только для видимых строк
Если вы хотите изменить значок для строк, которые не видны, вы должны рассмотреть, чтобы сохранить ViewHolders в список в адаптере и доступ к ним оттуда.

+1

Я попробовал, я нажав шестой элемент, он добавляет значок на 8 item.When я щелкаю к ​​8-му пункту, приложение рушится с nullpointerexception.Когда я нажимаю на 1-й, 2-й или 3-й и т. д., он работает нормально. –

+0

О, getChildAt работает только для видимых видов, а нуль соответствует firstVisiblePosition, дождитесь обновления ответа. – pomber

+0

Можете ли вы привести пример для невидимых строк? –

0

Вы можете получить представление с

ViewHolder vh = (ViewHolder) randomAdapter.getItem(position).getTag() 
vh.badge.show(); 

контроль get item

Edit: К сожалению о том, что неправильный метод

+0

Метод getView (int, View, ViewGroup) в типе ArrayAdapter не применим для аргументов (Integer) –

Смежные вопросы