我编写了一个ContentProvider
,它使用join从多个表(父级和子级)返回数据。结果是Cursor
,其中包含检索到的每个子表行的一行。例如。如果我的子表中有2行用于父表中的一行,则游标有2行,父列的重复值和子表的唯一值。
在ListView
中使用此功能时,我希望每个父级显示一个ListView
项,即每两条记录。
我已经编写了一个自CursorAdaptor
扩展的自定义适配器,我已按照以下方式覆盖了getView
,newView
和bindView
方法 -
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (!mDataValid) {
throw new IllegalStateException("this should only be called when the cursor is valid");
}
if (!mCursor.moveToPosition(position)) {
throw new IllegalStateException("couldn't move cursor to position " + position);
}
View v;
if (convertView == null) {
//If the lookup value _id is same for this record don't create new view
//instead only bind view and set the data from child table into existing view
String lookupValue = mCursor.getString(mCursor.getColumnIndex(mLookupColumn));
v = parent.findViewWithTag(lookupValue);
if(v == null){
v = newView(mContext, mCursor, parent);
v.setTag(lookupValue);
}
} else {
v = convertView;
}
this.bindView(v, mContext, mCursor);
return v;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
mAdapterView.setData(context, convertToDomainObject(cursor), view);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mInflater.inflate(mLayout, parent, false);
}
然而,结果很奇怪,我在备用位置得到空白视图是可以理解的(因为我的getView返回null)但是这也不一致。
我一直在努力解决这个问题。真的很感激任何帮助。
注意 - 使用distinct,group by没有帮助,因为我想获取两个记录并使用它们只将它们映射到一行,导致记录和列表项之间的*:1映射。
答案 0 :(得分:0)
如果您只想整理您的结果,我只需在分配您的适配器之前执行此操作。您没有指定是否为ListView
的行使用自定义布局,但这可能是一种可行的方法。
假设您有一个主要字段(例如,名称),并且对于该字段,还有其他几个字段(例如,几个电子邮件地址),第一个也可能是关键步骤是选择正确的数据容器。例如,我使用ArrayMap<String, ArrayList<String>>
。名称的左侧值和电子邮件地址的右侧值。在那之后,我将构建我的ListView
定义并覆盖getView()
方法,构建我的自定义布局。