【问题标题】:Android strange behavior with listview and custom cursor adapter列表视图和自定义光标适配器的 Android 奇怪行为
【发布时间】:2026-01-09 19:30:01
【问题描述】:

我的列表视图和自定义光标适配器有问题,我似乎无法弄清楚我的代码有什么问题。基本上,在我的活动中,我调用了 initalize(),它做了很多事情来处理获取正确的数据和初始化列表视图。在活动的第一次运行中,您可以从图像中看到列表中缺少一个项目。如果我去另一个活动并回到这个活动,那么丢失的项目就会出现。我相信它与 setContentView(R.layout.parent) 有关。如果我将它移到我的 initialize() 中,那么即使从另一个活动返回,该项目也不会出现。因此,出于某种原因,从另一个活动返回绕过 setContentView(R.layout.parent) 并且一切正常。我知道我不可能绕过 setContentView(R.layout.parent) 所以我需要找出问题所在。另外,我没有包含布局,因为它只不过是两个文本视图。

另外,我附上的图片并没有显示缺少的项目是列表中的最后一个。

自定义光标适配器:

public class CustomCursorAdapter extends SimpleCursorAdapter {

private Context context;
private int layout;

public CustomCursorAdapter (Context context, int layout, 
      Cursor c, String[] from, int[] to) {
    super(context, layout, c, from, to);
    this.context = context;
    this.layout = layout;
}

public View newView(Context context, Cursor cursor, ViewGroup parent) {

 LayoutInflater inflater = LayoutInflater.from(context);
 final View view = inflater.inflate(layout, parent, false);

 return view;
}

@Override
public void bindView(View v, Context context, Cursor c) {

    if (c.getColumnName(0).matches("section")){

        int nameCol = c.getColumnIndex("section");
        String section = c.getString(nameCol);

        TextView section_text = (TextView) v.findViewById(R.id.text1);
        if ((section.length() > 0)) {

            section_text.setText(section);

        }   else {
         //so we don't have an empty spot
            section_text.setText("");
            section_text.setVisibility(2);
            section_text.setHeight(1);
        }

    } else if (c.getColumnName(0).matches("code")) {


        int nameCol = c.getColumnIndex("code");
        String mCode = c.getString(nameCol);
        TextView code_text = (TextView) v.findViewById(R.id.text1);
        if (code_text != null) {
      int i = 167;
      byte[] data = {(byte) i};
      String strSymbol = EncodingUtils.getString(data, "windows-1252");

         mCode = strSymbol + " " + mCode;
            code_text.setText(mCode);
            code_text.setSingleLine();
        }

    }

    if (c.getColumnName(1).matches("title")){

        int nameCol = c.getColumnIndex("title");
        String mTitle = c.getString(nameCol);
        TextView title_text = (TextView) v.findViewById(R.id.text2);
        if (title_text != null) {

            title_text.setText(mTitle);
        }

    } else if (c.getColumnName(1).matches("excerpt")) {


        int nameCol = c.getColumnIndex("excerpt");
        String mExcerpt = c.getString(nameCol);
        TextView excerpt_text = (TextView) v.findViewById(R.id.text2);
        if (excerpt_text != null) {

            excerpt_text.setText(mExcerpt);
            excerpt_text.setSingleLine();

        }
    }
}

活动:

public class parent extends ListActivity {
private static String[] TITLE_FROM = {  SECTION, TITLE, _ID,  };
private static String[] CODE_FROM = { CODE, EXCERPT, _ID,  };
private static String ORDER_BY = _ID + " ASC";
private static int[] TO = { R.id.text1, R.id.text2, };



String breadcrumb = null;

private MyData data;
private SQLiteDatabase db;
CharSequence parent_id = "";


@Override
public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);      


    data = new MyData(this);

    db = data.getReadableDatabase();

    setContentView(R.layout.parent);


    initialize();


}

public void initialize() {

 breadcrumb = null;
 Bundle bun = getIntent().getExtras();
 TextView tvBreadCrumb;
 tvBreadCrumb = (TextView)findViewById(R.id.breadcrumb); 

    if (bun == null) {
     //this is the first run 
     tvBreadCrumb.setText(null);
  tvBreadCrumb.setHeight(0);
        parent_id = "0";
        try {
         Cursor cursor = getData(parent_id);
         showSectionData(cursor);
        } finally {
         data.close();
        }
    } else {
     CharSequence state = bun.getString("state");
  breadcrumb = bun.getString("breadcrumb");
  tvBreadCrumb.setText(breadcrumb);

  CharSequence code = bun.getString("code");
        parent_id = code;

     if (state.equals("chapter")) {

            try {
             Cursor cursor = getData(parent_id);
             showSectionData(cursor);
            } finally {
             data.close();
            }

     } else if (state.equals("code")) {

            try {
             Cursor cursor = getCodeData(parent_id);
             showCodeData(cursor);
            } finally {
             data.close();
            }

     }
    }
}

@Override
public void onStart() {

 //initialize();
 super.onResume();

}

@Override
public void onResume() {

 initialize();
 super.onResume();
}


private Cursor getData(CharSequence parent_id) {

 Cursor cTitles = db.query(TITLES_TABLE_NAME, TITLE_FROM, "parent_id = " + parent_id, null, null, null, ORDER_BY);
 Cursor cCodes = db.query(CODES_TABLE_NAME, CODE_FROM, "parent_id = " + parent_id, null, null, null, ORDER_BY);
 Cursor[] c = {cTitles, cCodes};
 Cursor cursor = new MergeCursor(c);
 startManagingCursor(cursor);
 return cursor;
}

private Cursor getCodeData(CharSequence parent_id2) {
    Bundle bun = getIntent().getExtras();
 CharSequence intent = bun.getString("intent");
 CharSequence searchtype = bun.getString("searchtype");
  //SQLiteDatabase db = data.getReadableDatabase();
 if (intent != null) {
  String sWhere = null; 
      if(searchtype.equals("code")) {
       sWhere = "code LIKE '%"+parent_id2+"%'";
      } else if(searchtype.equals("within")){
       sWhere = "definition LIKE '%"+parent_id2+"%'";
      }
      //This is a search request
  Cursor cursor = db.query(CODES_TABLE_NAME, CODE_FROM, sWhere, null, null, null, ORDER_BY); 
  startManagingCursor(cursor);
     return cursor;
 } else {
  Cursor cursor = db.query(CODES_TABLE_NAME, CODE_FROM, "parent_id = "+ parent_id2, null, null, null, ORDER_BY);
  startManagingCursor(cursor);
     return cursor;
 }

}

private void showSectionData(Cursor cursor) {
 CustomCursorAdapter adapter= new CustomCursorAdapter(this, R.layout.item, cursor, TITLE_FROM, TO);
 setListAdapter(adapter);
}

private void showCodeData(Cursor cursor) {
 CustomCursorAdapter adapter = new CustomCursorAdapter(this, R.layout.item, cursor, CODE_FROM, TO);
 setListAdapter(adapter);
 Bundle bun = getIntent().getExtras();
 CharSequence intent = bun.getString("intent");
 if (intent != null) {
  Cursor cursor1 = ((CursorAdapter)getListAdapter()).getCursor();
  startManagingCursor(cursor1);
  TextView tvBreadCrumb;
  tvBreadCrumb = (TextView)findViewById(R.id.breadcrumb); 
  tvBreadCrumb.setText(cursor1.getCount() + " Records Found");
  //cursor1.close(); //mdl
 }
}

【问题讨论】:

  • 在您使用的列表视图中,您是如何指定 layout_height 的?是“wrap_content”吗?如果是,请尝试使用诸如 240dp 之类的硬编码尺寸,检查它是否正常工作,在主要活动中并从另一个活动返回,是否一致!?
  • 我尝试了你的建议,一切看起来都应该如此。这到底是什么意思?
  • 如果我在 TextView layout_height 上设置大小,一切正常。这确实不能解决我的问题,因为我不希望 TextView 显示其中是否有任何内容。
  • 我刚刚注意到我提交的代码在光标适配器上的 BindView 中有错误应该是 section_text.setText(""); section_text.setVisibility(2); section_text.setHeight(1);
  • 是的,你的建议解决了这个问题,有点。现在我在顶部有空的 TextView,如果没有可显示的内容,我真的想避免出现空白。

标签: android listview cursor


【解决方案1】:

我发现了问题,并且怀疑是我的代码有问题。将 TextView 的可见性设置为 view.GONE 或 view.INVISIBLE 效果很好。问题是我再也没有让它可见。我从来没有调用 view.VISIBLE,这导致了一大堆问题。

 if (c.getColumnName(0).matches("section")){

    int nameCol = c.getColumnIndex("section");
    String section = c.getString(nameCol);

    TextView section_text = (TextView) v.findViewById(R.id.text1);
    if ((section.length() > 0)) {

        section_text.setText(section);
        // I forgot this!!!!!
        section_text.setVisibility(view.VISIBLE);

    }   else {
     //so we don't have an empty spot
        section_text.setVisibility(view.GONE);

    }

}

【讨论】:

    最近更新 更多