更改自定义CursorAdapter的行布局

爱奥努特·内格鲁(Ionut Negru)

我要在做出特定的按钮(动作)后更改行的布局。

public class DbCursorAdapter extends CursorAdapter {
private View selectedView;
private boolean isListSingleColumn = true;

private Cursor mCursor;
private final LayoutInflater mInflater;

private static final int TYPE_ITEM_SINGLE_COLUMN = 0;
private static final int TYPE_ITEM_MULTI_COLUMN = 1;

/**
 * DbCursorAdapter constructor
 * 
 * @param context
 *            - The context
 * @param cursor
 *            - The cursor used to make queries
 */
public DbCursorAdapter(Context context, Cursor cursor) {
    super(context, cursor, false);
    this.mContext = context;
    this.mCursor = cursor;
    this.mInflater = LayoutInflater.from(context);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    final ViewHolder holder = (ViewHolder) view.getTag();

    String collection = mCursor.getString(mCursor
            .getColumnIndex(DatabaseHelper.COLUMN_COLLECTION));
    String fileName = mCursor.getString(mCursor
            .getColumnIndex(DatabaseHelper.COLUMN_FILE_NAME));

    holder.title.setText(fileName);

    if (collection.equals("true")) {
        // different folder icon for multi-column list
        holder.icon
                .setImageResource(isListSingleColumn ? R.drawable.ic_file_folder2
                        : R.drawable.ic_file_folder);
        holder.details.setText("");
    } else {
        String extension = fileName
                .substring(fileName.lastIndexOf(".") + 1);
        extension = extension.toLowerCase();

        String size = mCursor.getString(mCursor
                .getColumnIndex(DatabaseHelper.COLUMN_RESOURCE_LENGTH));
        String actualSize = MemoryManagerHelper.getInstance().getFileSize(
                Float.parseFloat(size));

        holder.icon.setImageResource(Utils.INSTANCE
                .getImageResourceForFileType(extension));
        holder.details.setText(actualSize);
    }
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
    /*
     * Inflates the item layout. Stores resource IDs in a in a ViewHolder
     * class to prevent having to look them up each time bindView() is
     * called.
     */
    final View itemView = mInflater.inflate(
            isListSingleColumn ? R.layout.explorer_row_single_column
                    : R.layout.explorer_row_multi_column, viewGroup, false);

    final ViewHolder holder = new ViewHolder();
    holder.title = (TextView) itemView.findViewById(R.id.rowtitle);
    holder.details = (TextView) itemView.findViewById(R.id.rowSubtitle);
    holder.icon = (ImageView) itemView.findViewById(R.id.icon);

    itemView.setTag(holder);
    return itemView;
}

@Override
public int getItemViewType(int position) {
    return isListSingleColumn ? TYPE_ITEM_SINGLE_COLUMN
            : TYPE_ITEM_MULTI_COLUMN;
}

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public void changeCursor(Cursor cursor) {
    super.changeCursor(cursor);
    this.mCursor = cursor;
}

/**
 * @return <b>true</b> if there is an item selected, <b>false</b> otherwise.
 */
public boolean getSelectedItemState() {
    return null == selectedView ? false : true;
}

/**
 * Set the selected item.
 * 
 * @param view
 *            The item which will be set as selected
 */
public void setSelectedItem(View view) {
    selectedView = view;
    view.setBackgroundResource(R.drawable.explorer_row_selected);
}

/**
 * If any item is selected we clear that item.
 */
public void clearSelectedItem() {
    if (null != selectedView) {
        selectedView.setBackgroundResource(android.R.color.transparent);
        // invalidate the selected item
        selectedView = null;
    }
}

private class ViewHolder {
    private TextView title;
    private TextView details;
    private ImageView icon;
}

public boolean isListSingleColumn() {
    return isListSingleColumn;
}

public void setListSingleColumn(boolean isListSingleColumn) {
    this.isListSingleColumn = isListSingleColumn;
}

问题在于,并非所有项目的布局都正确更改,有些显示的布局已更改,有些则没有。另外,滚动项目的布局似乎会发生变化时,有时会采用正确的布局,有时会采用错误的布局。

我添加了一些解决方法,检测何时使用了错误的布局,并尝试手动创建正确的视图,但这似乎不起作用。

这是我如何称呼我的CursorAdapter:

/**
     * Change the number of columns the list view will upgrade.
     * 
     * @param item
     *            - The menu action button for the toggle option
     */
    private void changeGridColumns(MenuItem item) {
        if (isListSingleColumn) {
            listview.setNumColumns(2);
            item.setIcon(R.drawable.ic_menu_listgrid2);
            mAdapter.setListSingleColumn(false);
            mAdapter.notifyDataSetChanged();
        } else {
            // Set to display list with only 1 column
            listview.setNumColumns(1);
            item.setIcon(R.drawable.ic_menu_listgrid);
            mAdapter.setListSingleColumn(true);
            mAdapter.notifyDataSetChanged();
        }
        isListSingleColumn = !isListSingleColumn;
        mAdapter.clearSelectedItem();
    }

如何解决此问题?

用户

那不是应该管理项目布局更改的方式。您应该使用getItemViewType()getViewTypeCount方法:

public static final int SINGLE = 0;
public static final int MULTIPLE = 1;

@Override
public int getItemViewType(int position) {          
    return isListSingleColumn ? SINGLE : MULTIPLE; // call notifyDataSetChanged when you modify isListSingleColumn
}

@Override
public int getViewTypeCount() {     
    return 2;
}

// in the newView() method:
final int position = cursor.getPosition();
final int type = getItemViewType(position);
View itemView 
if (type == SINGLE) {
    itemView = mInflater.inflate(R.layout.explorer_row_single_column, viewGroup, false);
} else {
   itemView = mInflater.inflate(R.layout.explorer_row_multi_column, viewGroup, false);
}
// rest of the code

同样,顾名思义,该bindView()方法将用于将数据绑定到您收到的行视图,我不明白您为什么在此处再次构建了该项目的行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更改自定义CursorAdapter的行布局

来自分类Dev

更改自定义按钮属性

来自分类Dev

更改自定义指令的属性

来自分类Dev

更改自定义按钮的宽度

来自分类Dev

如何通过代码更改自定义视图布局的方向?

来自分类Dev

无法更改自定义Joomla 3组件中的布局

来自分类Dev

更改自定义选项时更改magento价格

来自分类Dev

更改自定义操作栏标题

来自分类Dev

我可以更改自定义标题吗?

来自分类Dev

在Word中更改自定义文档属性

来自分类Dev

在Android中更改自定义搜索栏的宽度

来自分类Dev

如何更改自定义滑动菜单的导航

来自分类Dev

更改自定义帖子类型网址

来自分类Dev

如何更改自定义控件的默认大小

来自分类Dev

在CakePHP中更改自定义日志的路径

来自分类Dev

无法更改自定义RatingBar的大小

来自分类Dev

以编程方式更改自定义按钮形状的颜色

来自分类Dev

更改自定义标记Google Maps的大小

来自分类Dev

文字类样式不更改自定义样式

来自分类Dev

更改自定义导航栏项目的文本

来自分类Dev

如何更改自定义UINavigationBar类的标签文本

来自分类Dev

更改自定义操作栏标题

来自分类Dev

我可以更改自定义标题吗?

来自分类Dev

更改自定义uibarbuttonitem(iOS7)的颜色

来自分类Dev

选中后更改自定义UIView背景

来自分类Dev

在后台无法更改自定义主题magento

来自分类Dev

更改自定义搜寻栏值以调整外观

来自分类Dev

以编程方式检测/更改自定义键盘

来自分类Dev

如何更改自定义标签功能?