2014-09-02 34 views
1

我有一个arrayadapter.I列出项目与此。从不同的方法更新适配器

我的代码:

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.When我点击第1或第2或第3等项目,它正常工作。 – 2014-09-02 22:03:35

+0

哦,getChildAt仅适用于可见视图,并且零对应于firstVisiblePosition,请等待答案更新 – pomber 2014-09-02 22:16:54

+0

您可以举一个不可见行的示例吗? – 2014-09-03 18:00:50

0

你可以得到

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

结账 get item

编辑观点:很抱歉,错误的方法

+0

ArrayAdapter 类型的getView(int,View,ViewGroup)方法不适用于参数(整型) – 2014-09-02 21:14:20