Android:在BaseAdapter中的TextView中遇到新行问题

时间:2014-12-23 09:03:47

标签: android textview newline baseadapter

基本上我在mysql db中插入文本和新行字符,如下所示:

$message = 'Hello World' . "\n";
$message .= 'This is a test' . "\n";
$message .= 'Thanks;

在db中保存邮件时,我尝试将新行的值设置为\n\\n\\\n\\\\n甚至是<br>,而不是\n然后在Android应用上使用了fromHtml,但没有任何效果。

在db中,我可以看到有新行。

在Android应用程序上我希望有新的行字符,如果在TextView中显示,我尝试了各种各样的东西,但没有任何工作,我已经尝试过这样的事情:

String message = m.getMessage().toString();
  message = message.replaceAll("\\n",
      System.getProperty("line.separator"));

此处代替"\\n",我还尝试了"\\\n""\n"甚至"\\\\n"

Spanned html = Html.fromHtml(m.getMessage());

message.replaceAll("\n","<br />");
message.replaceAll("\r\n","<br />");
message.replaceAll("\r","<br />");

android:singleLine="false"

尝试了各种各样的事情,在TextView中我得到了这些排列的文本:

Hello WorldThis is a testThanks

Hello World\This is a test\Thanks

Hello World\nThis is a test\nThanks

这是我的完整代码:

public class MessageListAdapter extends BaseAdapter {

    private Context context;
    private List<ListMessage> messagesItems;

    public MessageListAdapter(Context context, List<ListMessage> navDrawerItems) {
        this.context = context;
        this.messagesItems = navDrawerItems;
    }

    @Override
    public int getCount() {
        return messagesItems.size();
    }

    @Override
    public Object getItem(int position) {
        return messagesItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @SuppressLint("InflateParams")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        /**
         * The following list not implemented reusable list items as list items
         * are showing incorrect data Add the solution if you have one
         * */

        ListMessage m = messagesItems.get(position);

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        // Identifying the message owner
        if (messagesItems.get(position).isSelf()) {
            // message belongs to you, so load the right aligned layout
            convertView = mInflater.inflate(R.layout.list_item_message_right,
                    null);
        } else {
            // message belongs to other person, load the left aligned layout
            convertView = mInflater.inflate(R.layout.list_item_message_left,
                    null);
        }

        TextView lblFrom = (TextView) convertView
                .findViewById(R.id.lblMsgFromListMessage);
        TextView lblTo = (TextView) convertView
                .findViewById(R.id.lblMsgToListMessage);

        lblFrom.setText(m.getFromName());

        // Spanned html = Html.fromHtml(m.getMessage());
        // String message = html.toString();

        String message = m.getMessage().toString();
        message = message.replaceAll("\\n",
                System.getProperty("line.separator"));

        try {
            lblTo.setText(message);

        } catch (Exception e) {
            lblTo.setText(message);
        }

        return convertView;
    }
}

布局中的TextView:

<TextView
    android:id="@+id/lblMsgToListMessage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="50dp"
    android:background="@drawable/chat_bg_msg_from"
    android:paddingBottom="@dimen/five_dp"
    android:paddingLeft="@dimen/ten_dp"
    android:paddingRight="@dimen/ten_dp"
    android:paddingTop="@dimen/five_dp"
    android:textColor="@color/chat_title_gray"
    android:textSize="@dimen/eighteen_sp" />

baseAdaptor出了什么问题?在某个地方,我看到this link,它建议SimpleAdapter设置问题html,但就我而言,由于我使用的是BaseAdapter,因此无法提供帮助。

我真的非常感谢你的帮助,因为我已经浪费了五个小时来解决这个问题:(

1 个答案:

答案 0 :(得分:1)

尝试:

message = message.replaceAll("\\n", "&#10;");

或(仅当输入中确实存在双反斜杠时)

message = message.replaceAll("\\n", "&#10;");


更新:由于sql数据库已删除(转义)搜索字符串(\n),因此替换无法正常工作。 This answer提供了一种解决方法,其中包括在unescape上设置字符串之前运行TextView