【问题标题】:Dynamically increase the size of the cell in a list view in Android based on Content size?根据内容大小动态增加Android列表视图中单元格的大小?
【发布时间】:2012-08-27 11:50:03
【问题描述】:

我正在做一个使用自定义列表视图的项目,其中包含一个文本视图。数据来自服务器。我想根据数据大小更改单元格的高度。如果内容超过两行,我必须将其修剪为两行并显示一个查看更多按钮。单击查看更多按钮后,展开单元格以显示完整的详细信息。我用谷歌搜索了它。但我找不到任何有用的资源。谁能帮我解决这个问题,有什么有用的链接或建议吗?`

【问题讨论】:

    标签: android listview


    【解决方案1】:

    一种方法是首先使 listView 无效,强制它重绘可见元素,然后在适配器的 getView 方法中处理布局更改。
    试试这个:
    向您的适配器添加一个 showTrimmed(int position, boolean value) 方法。这将更新适配器内部的结构,该结构跟踪您要修剪或不修剪的列表项。然后在 getView 方法中,在创建项目视图时,测试是否应该修剪当前元素,并根据结果创建正确的视图。 我做了类似的事情来实现不同但相似的结果,并且它有效。 记得在调用 showTrimmed 后调用 invalidate 来强制 listView 重绘显示的项。

    编辑:我发布的代码与您想要做的不同,但在想法上非常相似:

    public class HeroListViewAdapter extends ArrayAdapter<Hero> {
    
    public static int NO_POS = -1;
    
    private List<Hero> heroes;
    private int selected_pos = NO_POS;
    
    public HeroListViewAdapter(Context context, List<Hero> heroes){
        super(context, R.layout.hero_list_item_view, heroes);
        this.heroes = heroes;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View rowView = GuiBuilder.createHeroListItemView(heroes.get(position),getContext(),parent,false);
        if(position == selected_pos){
            rowView.setBackgroundColor((rowView.getResources().getColor(R.color.list_item_selected_color)));
        }
        return rowView;
    }
    
    public void setSelectedPosition(int selected_pos){
        this.selected_pos = selected_pos;
    }
    
    public int getSelectedPosition(){
        return selected_pos;
    }
    
    public Hero getSelectedHero(){
        if(selected_pos>=0 && selected_pos<heroes.size())
            return this.getItem(selected_pos);
        else
            return null;
    }
    
    } 
    

    您应该使用 showTrimmed 方法而不是 setSelectedPosition 来更新内部成员,就像 setSelectedPos 所做的那样,以便跟踪每个列表项的修剪状态。然后在 getView 方法中进行测试(就像我在 if(position == selected_pos) 中所做的那样),然后根据测试结果构建自定义修剪或未修剪的列表项。我使用这些功能的听众是:

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
       public void onItemClick(AdapterView<?> parent, View view, int position, long id){
            list_adapter.setSelectedPosition(position);
            listView.invalidate();
            }
        }
    );
    

    您可以尝试根据您的需要更新此想法。特别是在我的情况下,我这样做是为了通过以编程方式更改其背景来突出显示单击的列表视图项。

    【讨论】:

    • 嗨,我没有完全理解您...如果可能的话,您能否粘贴相关代码
    • 我发布了我的代码。看看你是否可以根据自己的需要调整这个想法。
    猜你喜欢
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    相关资源
    最近更新 更多