android - android中的数据绑定(bind)复杂列表

标签 android list listview layout

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

最佳答案

使用自定义适配器使其成为 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,就像您需要你的投票按钮。

关于android - android中的数据绑定(bind)复杂列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13301802/

相关文章:

android - 如何在 Viewpager 中禁用预加载下一页?

android - 如何检查计时器是否仍在运行?

android - 从设备获取 authorId - android

java - 将 listView 数据从一个 Activity 发送到另一 Activity

带有复选框的android listview,没有列表 Activity

android - 将 ListView 中的位置传递给子 RecyclerView 适配器

android - Admob 横幅广告未在 Android 中加载

java - 如何使用 JDBC 在 ListView 或 TableView 中显示来自 SQL Server 的数据

python - 为什么元组比 Python 中的列表快?

python - 列表到字典 - 改进?