我想在創建特定按鈕(操作)時更改行佈局。更改自定義CursorAdapter的行佈局
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();
}
我怎樣才能解決這個問題?
我今天也遇到了CursorAdapter的一些問題。如果我想出任何提示,我一定會分享! – Matt
謝謝@Matt,如果我在此期間找到任何解決方案,我將同時發佈答案。 –