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
当前适配器存在两个低级错误,先修复避免异常:
getCount()方法错误:返回的result.length是未定义的变量,应该改为数据源Maany的长度:@Override public int getCount() { return Maany != null ? Maany.length : 0; }- 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,提问作者محمدشریف رحیمی
相关产品推荐
相关产品推荐

