我经历了很多关于如何分离项目并将它们分组在一个标题下的文章。总之,我喜欢根据是否显示标题使标题可见和不可见的想法。我也知道这种魔法发生在自定义适配器类的bindView / newView方法中。到现在为止还挺好。现在我正在查询数据库中的日期,我希望属于唯一日期的项目在日期标题下组合在一起。 (那就是我想按日期对项目进行分组)有没有办法可以在if else条件下检查日期(从光标中取出日期)并根据这些条件将它们组合在一起。我发现的一篇关于这个主题的文章是This。但是我无法完全理解它。对我来说,做同样的算法也行。
到目前为止,这是我的代码:
private class CurAdapter extends CursorAdapter{
// Context context;
// Cursor c;
public CurAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
// this.context = context;
// this.c= c;
}
@Override
public void bindView(View view, Context context, Cursor c) {
TextView tV = (TextView)view.findViewById(R.id.textView1);
TextView tV1 = (TextView)view.findViewById(R.id.textView2);
TextView tV2 = (TextView)view.findViewById(R.id.textView3);
ImageView iM = (ImageView)view.findViewById(R.id.imageView2);
tV1.setTypeface(tf);
tV2.setTypeface(tf);
tV.setText(dateConvert(c.getString(c.getColumnIndexOrThrow("DateToNotify"))));
String B = c.getString(c.getColumnIndexOrThrow("NotificationFor"));
tV1.setText(c.getString(c.getColumnIndexOrThrow("NotificationDateFor")));
if(B.equalsIgnoreCase("1")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}else if(B.equalsIgnoreCase("2")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}else if(B.equalsIgnoreCase("3")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}else if(B.equalsIgnoreCase("4")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}else if(B.equalsIgnoreCase("5")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}else if(B.equalsIgnoreCase("6")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}else if(B.equalsIgnoreCase("7")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}
}
@Override
public View newView(Context context, Cursor c, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.detail_list, parent, false);
bindView(v, context, c);
return v;
}
}
基本上我想要一种方法来检查DateToNotify对每一行的含义,具体取决于我将隐藏视图。任何提示?
修改
到目前为止,这是我尝试过的,虽然我得到了理想的结果,但滚动列表会弄乱一切:
@Override
public void bindView(View view, Context context, Cursor c) {
TextView tV = (TextView)view.findViewById(R.id.textView1);
TextView tV1 = (TextView)view.findViewById(R.id.textView2);
TextView tV2 = (TextView)view.findViewById(R.id.textView3);
ImageView iM = (ImageView)view.findViewById(R.id.imageView2);
tV1.setTypeface(tf);
tV2.setTypeface(tf);
if(tV.getText().toString().equals(dateConvert(c.getString(c.getColumnIndexOrThrow("DateToNotify"))))){
tV.setVisibility(View.INVISIBLE);
}else{
tV.setVisibility(View.VISIBLE);
tV.setText(dateConvert(c.getString(c.getColumnIndexOrThrow("DateToNotify"))));
}
修改
根据This Question on StackOverflow优化代码
@Override
public View newView(Context context, Cursor c, ViewGroup parent) {
View view = LayoutInflater.from(context).inflate(R.layout.detail_list, null);
//bindView(v, context, c);
TextView tV = (TextView)view.findViewById(R.id.textView1);
TextView tV1 = (TextView)view.findViewById(R.id.textView2);
TextView tV2 = (TextView)view.findViewById(R.id.textView3);
ImageView iM = (ImageView)view.findViewById(R.id.imageView2);
RelativeLayout RL = (RelativeLayout)view.findViewById(R.id.relative1);
view.setTag(R.id.textView1, tV);
view.setTag(R.id.textView2, tV1);
view.setTag(R.id.textView3, tV2);
view.setTag(R.id.imageView2, iM);
view.setTag(R.id.relative1, RL);
return view;
}
和BindView:
@Override
public void bindView(View view, Context context, Cursor c) {
((TextView) view.getTag(R.id.textView2)).setTypeface(tf);
((TextView) view.getTag(R.id.textView3)).setTypeface(tf);
// RelativeLayout RL =(RelativeLayout)view.findViewById(R.id.relative1);
String Bb = ((TextView) view.getTag(R.id.textView1)).getText().toString();
if(Bb.equals(dateConvert(c.getString(c.getColumnIndexOrThrow("DateToNotify"))))){
Toast.makeText(getActivity(), "If Condition: "+Bb, 10000).show();
((RelativeLayout)view.getTag(R.id.relative1)).setVisibility(View.INVISIBLE);
}else{
((RelativeLayout)view.getTag(R.id.relative1)).setVisibility(View.VISIBLE);
((TextView) view.getTag(R.id.textView1)).setText(dateConvert(c.getString(c.getColumnIndexOrThrow("DateToNotify"))));
}
答案 0 :(得分:0)
以下是针对您的问题定制的解决方案:(基于您提供的链接)
private class CurAdapter extends CursorAdapter{
private static final int VIEW_TYPE_GROUP_START = 0;
private static final int VIEW_TYPE_GROUP_CONT = 1;
private static final int VIEW_TYPE_COUNT = 2;
LayoutInflater mInflater ;
public CurAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
mInflater = LayoutInflater.from(context);
}
@Override
public int getViewTypeCount() {
return VIEW_TYPE_COUNT;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return VIEW_TYPE_GROUP_START;
}
Cursor cursor = getCursor();
cursor.moveToPosition(position);
boolean newGroup = isNewGroup(cursor, position);
if (newGroup) {
return VIEW_TYPE_GROUP_START;
} else {
return VIEW_TYPE_GROUP_CONT;
}
}
@Override
public void bindView(View view, Context context, Cursor c) {
TextView tV = (TextView)view.findViewById(R.id.textView1);
TextView tV1 = (TextView)view.findViewById(R.id.textView2);
TextView tV2 = (TextView)view.findViewById(R.id.textView3);
ImageView iM = (ImageView)view.findViewById(R.id.imageView2);
tV1.setTypeface(tf);
tV2.setTypeface(tf);
if(tV!=null)
tV.setText(dateConvert(c.getString(c.getColumnIndexOrThrow("DateToNotify"))));
String B = c.getString(c.getColumnIndexOrThrow("NotificationFor"));
tV1.setText(c.getString(c.getColumnIndexOrThrow("NotificationDateFor")));
if(B.equalsIgnoreCase("1")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.XXX);
}else if(B.equalsIgnoreCase("2")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}else if(B.equalsIgnoreCase("3")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}else if(B.equalsIgnoreCase("4")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}else if(B.equalsIgnoreCase("5")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}else if(B.equalsIgnoreCase("6")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}else if(B.equalsIgnoreCase("7")){
tV2.setText("Is "+c.getString(c.getColumnIndexOrThrow("NotificationData"))+" XXX");
iM.setBackgroundResource(R.drawable.icon_XXX);
}
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
int position = cursor.getPosition();
int nViewType;
if (position == 0) {
nViewType = VIEW_TYPE_GROUP_START;
} else {
boolean newGroup = isNewGroup(cursor, position);
if (newGroup) {
nViewType = VIEW_TYPE_GROUP_START;
} else {
nViewType = VIEW_TYPE_GROUP_CONT;
}
}
View v;
if (nViewType == VIEW_TYPE_GROUP_START) {
v = mInflater.inflate(R.layout.detail_list, parent, false);
View vHeader = v.findViewById(R.id.relativeSecondary);
vHeader.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
} else {
v = mInflater.inflate(R.layout.detail_list_no_header, parent, false);
}
return v;
}
private boolean isNewGroup(Cursor cursor, int position) {
String ThisDate = dateConvert(cursor.getString(cursor.getColumnIndexOrThrow("DateToNotify")));
cursor.moveToPosition(position - 1);
String compareDate = dateConvert(cursor.getString(cursor.getColumnIndexOrThrow("DateToNotify")));
cursor.moveToPosition(position);
if (!ThisDate.equalsIgnoreCase(compareDate)) {
return true;
}
return false;
}
}