【发布时间】:2014-05-21 12:10:15
【问题描述】:
我正在尝试在列表视图中添加粘性标题。我在https://github.com/beworker/pinned-section-listview找到的代码的帮助下实现了这一点
下面是我将列表视图行设为的图片
它工作正常,但我需要自定义上面的行。单行有两个单独的布局,它们是 a.) listheader.xml b.) listrow.xml 这两个 xml 都是 listview 单行的两个独立部分。
现在我想做的是列表行标题应该是透明背景(listheader.xml),而listrow.xml不应该有一个拿着相机的人的背景图像。图像应设置为每个列表视图行的背景。如下所示
所以我的列表视图行将有一个背景图像和一个标题,而不是在图像上方,而是在图像上方,如上图所示。 谁能告诉我我该怎么做。 下面是我使用的适配器代码。
public abstract class SectionAdapter extends BaseAdapter implements
OnItemClickListener {
private int mCount = -1;
Context context;
public SectionAdapter(Context c) {
this.context = c;
// TODO Auto-generated constructor stub
}
public abstract int numberOfSections();
public abstract int numberOfRows(int section);
public abstract View getRowView(int section, int row, View convertView,
ViewGroup parent);
public abstract Object getRowItem(int section, int row);
public boolean hasSectionHeaderView(int section) {
return false;
}
public View getSectionHeaderView(int section, View convertView,
ViewGroup parent) {
return null;
}
public Object getSectionHeaderItem(int section) {
return null;
}
public int getRowViewTypeCount() {
return 1;
}
public int getSectionHeaderViewTypeCount() {
return 0;
}
/**
* Must return a value between 0 and getRowViewTypeCount() (excluded)
*/
public int getRowItemViewType(int section, int row) {
return 0;
}
/**
* Must return a value between 0 and getSectionHeaderViewTypeCount()
* (excluded, if > 0)
*/
public int getSectionHeaderItemViewType(int section) {
return 0;
}
@Override
/**
* Dispatched to call onRowItemClick
*/
public final void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
onRowItemClick(parent, view, getSection(position),
getRowInSection(position), id);
}
public void onRowItemClick(AdapterView<?> parent, View view, int section,
int row, long id) {
}
@Override
/**
* Counts the amount of cells = headers + rows
*/
public final int getCount() {
if (mCount < 0) {
mCount = numberOfCellsBeforeSection(numberOfSections());
}
return mCount;
}
@Override
public boolean isEmpty() {
return getCount() == 0;
}
@Override
/**
* Dispatched to call getRowItem or getSectionHeaderItem
*/
public final Object getItem(int position) {
int section = getSection(position);
if (isSectionHeader(position)) {
if (hasSectionHeaderView(section)) {
return getSectionHeaderItem(section);
}
return null;
}
return getRowItem(section, getRowInSection(position));
}
@Override
public long getItemId(int position) {
return position;
}
@Override
/**
* Dispatched to call getRowView or getSectionHeaderView
*/
public final View getView(int position, View convertView, ViewGroup parent) {
/*
* RelativeLayout rl = new RelativeLayout(context); LayoutParams
* listParams = new LayoutParams(LayoutParams.MATCH_PARENT,
* LayoutParams.MATCH_PARENT); rl.setLayoutParams(listParams);
* convertView = (View)rl;
*/
int section = getSection(position);
if (isSectionHeader(position)) {
if (hasSectionHeaderView(section)) {
return getSectionHeaderView(section, convertView, parent);
}
return null;
}
return getRowView(section, getRowInSection(position), convertView,
parent);
// return convertView;
}
/**
* Returns the section number of the indicated cell
*/
protected int getSection(int position) {
int section = 0;
while (numberOfCellsBeforeSection(section) <= position) {
section++;
}
return section - 1;
}
/**
* Returns the row index of the indicated cell Should not be call with
* positions directing to section headers
*/
protected int getRowInSection(int position) {
int section = getSection(position);
int row = position - numberOfCellsBeforeSection(section);
if (hasSectionHeaderView(section)) {
return row - 1;
} else {
return row;
}
}
/**
* Returns true if the cell at this index is a section header
*/
protected boolean isSectionHeader(int position) {
int section = getSection(position);
return hasSectionHeaderView(section)
&& numberOfCellsBeforeSection(section) == position;
}
/**
* Returns the number of cells (= headers + rows) before the indicated
* section
*/
protected int numberOfCellsBeforeSection(int section) {
int count = 0;
for (int i = 0; i < Math.min(numberOfSections(), section); i++) {
if (hasSectionHeaderView(i)) {
count += 1;
}
count += numberOfRows(i);
}
return count;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
mCount = numberOfCellsBeforeSection(numberOfSections());
}
@Override
public void notifyDataSetInvalidated() {
super.notifyDataSetInvalidated();
mCount = numberOfCellsBeforeSection(numberOfSections());
}
@Override
/**
* Dispatched to call getRowItemViewType or getSectionHeaderItemViewType
*/
public final int getItemViewType(int position) {
int section = getSection(position);
if (isSectionHeader(position)) {
return getRowViewTypeCount()
+ getSectionHeaderItemViewType(section);
} else {
return getRowItemViewType(section, getRowInSection(position));
}
}
@Override
/**
* Dispatched to call getRowViewTypeCount and getSectionHeaderViewTypeCount
*/
public final int getViewTypeCount() {
return getRowViewTypeCount() + getSectionHeaderViewTypeCount();
}
@Override
/**
* By default, disables section headers
*/
public boolean isEnabled(int position) {
return !isSectionHeader(position);
}
}
【问题讨论】:
-
尝试使用 framelayout 或 relativelayout
-
能否请您详细说明如何使用框架布局或相对布局
-
如果第二张图片中的整个内容只是列表中的一项,为什么不为其项目创建一个带有单个 xml 的自定义列表视图?然后在您的自定义适配器中,您将所有这些信息和图片设置在它们的位置。