【问题标题】:Update adapter from different method从不同的方法更新适配器
【发布时间】:2014-09-02 20:53:04
【问题描述】:

我有一个数组适配器。我正在用这个列出项目。

我的代码:

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

如您所见,我正在加载徽章。但是徽章不可见,我想从特定项目的另一种方法显示它。

示例:randomAdapter(position_id).holder.badge.show();我想要这样的代码。我该怎么做?

【问题讨论】:

    标签: android android-adapter


    【解决方案1】:

    您可以使用

    获取视图
    ViewHolder vh = (ViewHolder) randomAdapter.getItem(position).getTag()
    vh.badge.show();
    

    结帐 get item

    编辑:对错误的方法感到抱歉

    【讨论】:

    • ArrayAdapter 类型的getView(int, View, ViewGroup) 方法不适用于参数(Integer)
    【解决方案2】:

    试试这个(未经测试的)代码:

    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
    }
    

    更新:这只适用于可见行
    如果您想更改不可见行的标记,您应该考虑将 ViewHolders 存储在适配器的列表中并从那里访问它们。

    【讨论】:

    • 我试过了,我点击第六个项目,它正在为第 8 个项目添加徽章。当我点击第 8 个项目时,应用程序因 nullpointerexception 而崩溃。当我点击第一个或第二个或第三个等项目时,它工作正常。
    • 哦,getChildAt只对可见视图有效,0对应firstVisiblePosition,等待答案更新
    • 你能举一个不可见行的例子吗?
    • 将视图持有者存储在列表中。对于适配器中的每个项目?这将抵消使用列表视图的好处。
    • @atalum 会否定什么好处?
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多