You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite读取的文本在自定义ListView中仅单行显示,如何实现多行展示?

问题:从SQLite读取的文本在自定义ListView中仅显示单行,如何实现多行显示?

我的场景是从SQLite数据库获取文本列表,然后在自定义ListView中展示。数据库里的文本示例是类似Hello Have are you?的内容,但读取后在ListView里只显示成单行,请问怎么改成多行显示?问题出在哪里?

我的数据库读取代码:

final SQLiteDatabase mydb = new MyDatabase2(EnglishActivity.this).getWritableDatabase(); 
Cursor cT=mydb.rawQuery(" SELECT * FROM " + TABLE + " WHERE " + TITLE + " LIKE ? " ,new String []{inputSearch.getText()+"%"}); 
array = new String[cT.getCount()]; 
int i = 0; 
while(cT.moveToNext()){ 
    String uname = cT.getString(cT.getColumnIndex(TITLE)); 
    array[i] = uname; 
    i++; 
} 
lv.setAdapter( new EnCustomAdapter(EnglishActivity.this,array,tf)); 

自定义适配器代码:

public class EnCustomAdapter extends BaseAdapter { 
    Context context; 
    String[] Maany; 
    Typeface tff; 
    private static LayoutInflater inflater=null; 
    public EnCustomAdapter(Activity mainActivity, String[] maany, Typeface tf) { 
        tff=tf; 
        context=mainActivity; 
        Maany=maany; 
        inflater = ( LayoutInflater )context. getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 
    @Override 
    public int getCount() { 
        return result.length; // 这里存在错误! 
    } 
    @Override 
    public Object getItem(int position) { 
        return position; 
    } 
    @Override 
    public long getItemId(int position) { 
        return position; 
    } 
    public class Holder { 
        TextView tv1; 
        Typeface t; 
    } 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
        Holder holder=new Holder(); 
        View rowView; 
        rowView = inflater.inflate(R.layout.list_item_english, null); 
        holder.tv=(TextView) rowView.findViewById(R.id.txtFa); // Holder定义与实际引用不匹配
        holder.tv.setText(Maany[position]); 
        holder.tv.setTypeface(tff); 
        return rowView; 
    } 
}

问题分析与解决方案

一、先修正适配器中的明显bug

当前适配器存在两个低级错误,先修复避免异常:

  1. getCount()方法错误:返回的result.length是未定义的变量,应该改为数据源Maany的长度:
    @Override
    public int getCount() {
        return Maany != null ? Maany.length : 0;
    }
    
  2. Holder类与引用不匹配:Holder中定义的是tv1,但getView里用了holder.tv,会导致空指针,修正后:
    public class Holder {
        TextView tv; // 与实际引用的变量名一致
    }
    

二、核心解决:让TextView支持多行显示

文本只显示单行的关键原因是ListView item布局中的TextView默认是单行模式,需要修改布局文件res/layout/list_item_english.xml中ID为txtFa的TextView属性:

<TextView
    android:id="@+id/txtFa"
    <!-- 其他原有属性保留 -->
    android:maxLines="0" <!-- 设置为0表示不限行数,自动根据内容换行 -->
    android:singleLine="false" <!-- 明确关闭单行显示模式 -->
    android:ellipsize="none" <!-- 不需要省略号就设为none,如需省略可改为end等 -->
    android:textSize="14sp"
    android:textColor="#333333" />

如果需要固定显示行数,可以把android:maxLines="0"改成具体数字(比如android:maxLines="2")。

三、ListView性能优化(可选但推荐)

当前getView方法每次都重新创建Holder和加载布局,会导致滑动卡顿,改成复用convertView的写法:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    Holder holder;
    if (convertView == null) {
        holder = new Holder();
        // 加载布局时绑定parent,避免布局参数异常
        convertView = inflater.inflate(R.layout.list_item_english, parent, false);
        holder.tv = (TextView) convertView.findViewById(R.id.txtFa);
        convertView.setTag(holder);
    } else {
        holder = (Holder) convertView.getTag();
    }
    holder.tv.setText(Maany[position]);
    holder.tv.setTypeface(tff);
    return convertView;
}

四、特殊场景:强制文本换行

如果你的数据库文本本身是连续字符串,但需要在特定位置换行,可以在读取数据时手动添加换行符\n,比如:

String uname = cT.getString(cT.getColumnIndex(TITLE));
// 示例:把空格替换为换行符,根据需求调整规则
uname = uname.replace(" ", "\n");
array[i] = uname;

内容的提问来源于stack exchange,提问作者محمدشریف رحیمی

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:56:10