【问题标题】:Databind Complex list in androidandroid中的数据绑定复杂列表
【发布时间】:2012-11-09 03:42:58
【问题描述】:

所以我想在下面创建这个 UI。这是上大学的课,我的时间不多了。我的一切正常,但我无法全神贯注地列出事件列表。我有一个 java 类 eventList,它用数据库中的数据填充一个 List。有什么建议么?我是否必须动态添加 2 个按钮(向上/向下)和足够的文本视图来提供数据?如果我这样做,我将如何保持它的格式?我应该把它全部放在主页面的滚动视图中吗?

【问题讨论】:

  • 这个线框是否显示了三个事件的列表,其中每个事件的左侧都有一个向上/向下按钮,并且(可能)这些按钮之间有一个 id?
  • @323go 是,但该数字是从数据库中提取的该事件的总票数。每个用户都可以投票赞成或反对事件。
  • 哦,这些是投票按钮...

标签: android list listview layout


【解决方案1】:

使用自定义适配器将其设为ListView。每一行都可以设计成RelativeLayout,这样你就可以把你的活动名称、地点等放在里面。

适配器看起来像这样:(代码清理)

public class POPublicationAdapter extends ArrayAdapter<Wrap<POUserPublication>> {
    private final Context context;
    ... 
    private OnClickListener faveClick;
    private OnClickListener shortClick;
    ...

    public POPublicationAdapter( Context context, List<WrapPO<POUserPublication>> values, 
            OnClickListener faveClick, OnClickListener shortClick, ... ) {
        super(context, R.layout.row_publication, values);
        this.context = context;
        this.listId = listId;
        this.faveClick = faveClick;
        this.shortClick = shortClick;
            ...
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        WrapPO<POUserPublication> item = getItem(position);
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = null;

        if( item.item != null ){
            rowView = inflater.inflate(R.layout.row_publication, parent, false);
            rowView.setTag( item );
            TextView tvLabel = (TextView) rowView.findViewById(R.id....);
            ImageView ivPubFavorite = (ImageView) rowView.findViewById(R.id....);

            TextView tvSubLabel = (TextView) rowView.findViewById(R.id.publicationSublabel);
            tvLabel.setText( item.item.pub().get( PO.displayName ) );
            if( !item.item.pub().existsDefault() ) {

            }
            if( listId == POLayer.LIST_REQUIRED ) 
                tvSubLabel.setText(String.format("(Due on %1$TD)", item.item.asDate( PO.dueDate )));
            else if( listId == POLayer.LIST_PREVIEW )
                tvSubLabel.setText( String.format( "(Preview until %1$TD)", item.item.pub().asDate( PO.distributionDate ) ) );
            else
                tvSubLabel.setText( item.item.getTouchInfo() );

            if( this.listId == POLayer.LIST_FAVE ){
                setOfflineImage(ivPubFavorite, SG.isOnline, item.item.isFavorite() ? R.drawable.ls_star_remove : R.drawable.ls_star_grey );
            } else {
                setOfflineImage(ivPubFavorite, SG.isOnline, item.item.isFavorite() ? R.drawable.ls_star_gold : R.drawable.ls_star_grey );
            }
            ivPubFavorite.setClickable(true);
            ivPubFavorite.setTag(item);
            ivPubFavorite.setOnClickListener( faveClick );

            ivNot.setClickable( false );
            if( listId == POLayer.LIST_REQUIRED || listId == POLayer.LIST_UNREAD ) {
                ivNot.setTag(item);
                ivNot.setOnClickListener( notClick );
                if( item.item.isRequired() ) {
                    if( item.item.isComplete() ) {
                        setOfflineImage( ivNot, item.item.asString( PO.offlineUTC ).isEmpty(), R.drawable.ls_doc_confirmed );
                    } else {
                        ivNot.setClickable(true);
                        ivNot.setImageResource( R.drawable.ls_doc_pencil );
                    }
                } else {
                    if( item.item.isComplete() ) {
                        ivNot.setImageResource(R.drawable.ls_check_green);
                    } else {
                        ivNot.setClickable(true);
                        setOfflineImage( ivNot, SG.isOnline, R.drawable.ls_check_grey );
                    }
                }   
            } else {
                ivNot.setVisibility( View.GONE );
            }
        } else {
            switch( item.itemType ) {
            case WrapPO.HEADER_EMPTY:
                rowView = inflater.inflate( R.layout.row_header_empty, parent, false);
                break;
            case WrapPO.HEADER_MORE:
                rowView = inflater.inflate( R.layout.row_header_more, parent, false);
                break;
            default:
                rowView = inflater.inflate( R.layout.row_header, parent, false);
            }
            TextView tvLabel = (TextView) rowView.findViewById(R.id.tvHeader);
            tvLabel.setText( item.itemHeader );
        }
        rowView.setOnLongClickListener( longClick );
        rowView.setOnClickListener( shortClick );
        return rowView;
    }
    @Override
    public long getItemId(int position) {
        if( getItem( position ).item != null )
            return getItem(position).item.asInteger( PO.pubId );
        else
            return (long) -1;
    }
}

这可能是您需要的一个更复杂的示例,但它显示了如何根据行的内容为行使用不同的布局,并且其中包含可点击的 ImageView,就像您需要的一样你的投票按钮。

【讨论】:

  • 所以你正在使用充气机。这段代码是 Fragment UI 的一个特性吗?
  • 这可能正是我需要的。不过,我将不得不等到稍后再尝试。谢谢。
  • 就片段而言,这可能在片段内部,但布局充气器是 Android 的一个组成部分,自 API 1 以来一直存在。请注意,此代码不执行 convertView 或任何其他某种(推荐的)资源保存。
  • 好的,很酷。我不是 android 大师,只是想在我深入研究之前站稳脚跟。如果没有 ics 支持库,这可以在 Gingerbread 上使用吗?
  • 接受与否的答案,我只是期待听到它有效。总是很乐意提供帮助!
猜你喜欢
  • 2015-08-07
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多