ListView 中的 TextView 在滚动时发生变化
TextView inside ListView get changed on scrolling
我有一个自定义适配器可以显示对话中的消息。现在,如果未阅读消息,我想将文本视图加粗,否则取消加粗。但是,当我滚动该适配器的列表视图时,TextViews 不保留以前的设置,它们会丢失粗体文本或粗体读取文本。我在 SO 上尝试了很多解决方案,但是到目前为止没有任何效果。
我已经把所有的变量都放到一个容器里了class:
private class Holder {
public TextView messageTo, messageContent, date;
public ImageView imgView;
public Typeface face, bold;
public int boldText, normalText;
public int readState;
}
在 getView 中,我在该位置获取消息项并从那里检索 readState(省略了一些多余的部分)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View convertView1 = convertView;
LayoutInflater vi = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Message message = getItem(position);
if (convertView1 == null) {
holder = new Holder();
convertView1 = vi.inflate(R.layout.list_view_main, parent,
false);
holder.messageTo = (TextView) convertView1
.findViewById(R.id.address);
holder.messageContent = (TextView) convertView1
.findViewById(R.id.previewMsg);
holder.date = (TextView) convertView1.findViewById(R.id.showDate);
holder.imgView = (ImageView) convertView1
.findViewById(R.id.quickBadge);
holder.face = Typeface.createFromAsset(ctx.getAssets(),
"fonts/helveticaneuelight.ttf");
holder.bold = Typeface.createFromAsset(ctx.getAssets(),
"fonts/helveticaneue.ttf");
holder.boldText = Typeface.BOLD;
holder.normalText = Typeface.NORMAL;
holder.readState = getItem(position).readState;
convertView1.setTag(holder);
} else {
holder = (Holder) convertView1.getTag();
}
if(holder.readState==0) {
holder.messageTo.setText(message.messageNumber);
holder.messageContent.setText(message.messageContent);
holder.date.setText(message.messageDate);
holder.messageTo.setTypeface(holder.bold, holder.boldText);
holder.messageContent.setTypeface(holder.face, holder.boldText);
holder.date.setTypeface(holder.face, holder.boldText);
} else {
holder.messageTo.setText(message.messageNumber);
holder.messageContent.setText(message.messageContent);
holder.date.setText(message.messageDate);
holder.messageTo.setTypeface(holder.bold, holder.normalText);
holder.messageContent.setTypeface(holder.face, holder.normalText);
holder.date.setTypeface(holder.face, holder.normalText);
}
return convertView1;
}
但是不行。有人对此有解决方案吗?
试试这个
if(message.readState==0) {
// keep your other part of the code as it is
// set font
} else {
// keep your other code as it is
// set font
}
你可以去掉
holder.readState = getItem(position).readState;
了解其工作原理
How ListView's recycling mechanism works
您可以按照 Raghunandan 的回答进行操作,但以下回答对您也有帮助:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View convertView1 = convertView;
LayoutInflater vi = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Message message = getItem(position);
final Holder holder;
if (convertView1 == null) {
holder = new Holder();
convertView1 = vi.inflate(R.layout.list_view_main, parent,
false);
holder.messageTo = (TextView) convertView1
.findViewById(R.id.address);
holder.messageContent = (TextView) convertView1
.findViewById(R.id.previewMsg);
holder.date = (TextView) convertView1.findViewById(R.id.showDate);
holder.imgView = (ImageView) convertView1
.findViewById(R.id.quickBadge);
holder.face = Typeface.createFromAsset(ctx.getAssets(),
"fonts/helveticaneuelight.ttf");
holder.bold = Typeface.createFromAsset(ctx.getAssets(),
"fonts/helveticaneue.ttf");
holder.boldText = Typeface.BOLD;
holder.normalText = Typeface.NORMAL;
holder.readState = getItem(position).readState;
convertView1.setTag(holder);
} else {
holder = (Holder) convertView1.getTag();
}
if(holder.readState==0) {
holder.messageTo.setText(message.messageNumber);
holder.messageContent.setText(message.messageContent);
holder.date.setText(message.messageDate);
holder.messageTo.setTypeface(holder.bold, holder.boldText);
holder.messageContent.setTypeface(holder.face, holder.boldText);
holder.date.setTypeface(holder.face, holder.boldText);
} else {
holder.messageTo.setText(message.messageNumber);
holder.messageContent.setText(message.messageContent);
holder.date.setText(message.messageDate);
holder.messageTo.setTypeface(holder.bold, holder.normalText);
holder.messageContent.setTypeface(holder.face, holder.normalText);
holder.date.setTypeface(holder.face, holder.normalText);
}
return convertView1;
}
只需在 getview()
方法中创建 holder 对象。
我有一个自定义适配器可以显示对话中的消息。现在,如果未阅读消息,我想将文本视图加粗,否则取消加粗。但是,当我滚动该适配器的列表视图时,TextViews 不保留以前的设置,它们会丢失粗体文本或粗体读取文本。我在 SO 上尝试了很多解决方案,但是到目前为止没有任何效果。
我已经把所有的变量都放到一个容器里了class:
private class Holder {
public TextView messageTo, messageContent, date;
public ImageView imgView;
public Typeface face, bold;
public int boldText, normalText;
public int readState;
}
在 getView 中,我在该位置获取消息项并从那里检索 readState(省略了一些多余的部分)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View convertView1 = convertView;
LayoutInflater vi = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Message message = getItem(position);
if (convertView1 == null) {
holder = new Holder();
convertView1 = vi.inflate(R.layout.list_view_main, parent,
false);
holder.messageTo = (TextView) convertView1
.findViewById(R.id.address);
holder.messageContent = (TextView) convertView1
.findViewById(R.id.previewMsg);
holder.date = (TextView) convertView1.findViewById(R.id.showDate);
holder.imgView = (ImageView) convertView1
.findViewById(R.id.quickBadge);
holder.face = Typeface.createFromAsset(ctx.getAssets(),
"fonts/helveticaneuelight.ttf");
holder.bold = Typeface.createFromAsset(ctx.getAssets(),
"fonts/helveticaneue.ttf");
holder.boldText = Typeface.BOLD;
holder.normalText = Typeface.NORMAL;
holder.readState = getItem(position).readState;
convertView1.setTag(holder);
} else {
holder = (Holder) convertView1.getTag();
}
if(holder.readState==0) {
holder.messageTo.setText(message.messageNumber);
holder.messageContent.setText(message.messageContent);
holder.date.setText(message.messageDate);
holder.messageTo.setTypeface(holder.bold, holder.boldText);
holder.messageContent.setTypeface(holder.face, holder.boldText);
holder.date.setTypeface(holder.face, holder.boldText);
} else {
holder.messageTo.setText(message.messageNumber);
holder.messageContent.setText(message.messageContent);
holder.date.setText(message.messageDate);
holder.messageTo.setTypeface(holder.bold, holder.normalText);
holder.messageContent.setTypeface(holder.face, holder.normalText);
holder.date.setTypeface(holder.face, holder.normalText);
}
return convertView1;
}
但是不行。有人对此有解决方案吗?
试试这个
if(message.readState==0) {
// keep your other part of the code as it is
// set font
} else {
// keep your other code as it is
// set font
}
你可以去掉
holder.readState = getItem(position).readState;
了解其工作原理
How ListView's recycling mechanism works
您可以按照 Raghunandan 的回答进行操作,但以下回答对您也有帮助:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View convertView1 = convertView;
LayoutInflater vi = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Message message = getItem(position);
final Holder holder;
if (convertView1 == null) {
holder = new Holder();
convertView1 = vi.inflate(R.layout.list_view_main, parent,
false);
holder.messageTo = (TextView) convertView1
.findViewById(R.id.address);
holder.messageContent = (TextView) convertView1
.findViewById(R.id.previewMsg);
holder.date = (TextView) convertView1.findViewById(R.id.showDate);
holder.imgView = (ImageView) convertView1
.findViewById(R.id.quickBadge);
holder.face = Typeface.createFromAsset(ctx.getAssets(),
"fonts/helveticaneuelight.ttf");
holder.bold = Typeface.createFromAsset(ctx.getAssets(),
"fonts/helveticaneue.ttf");
holder.boldText = Typeface.BOLD;
holder.normalText = Typeface.NORMAL;
holder.readState = getItem(position).readState;
convertView1.setTag(holder);
} else {
holder = (Holder) convertView1.getTag();
}
if(holder.readState==0) {
holder.messageTo.setText(message.messageNumber);
holder.messageContent.setText(message.messageContent);
holder.date.setText(message.messageDate);
holder.messageTo.setTypeface(holder.bold, holder.boldText);
holder.messageContent.setTypeface(holder.face, holder.boldText);
holder.date.setTypeface(holder.face, holder.boldText);
} else {
holder.messageTo.setText(message.messageNumber);
holder.messageContent.setText(message.messageContent);
holder.date.setText(message.messageDate);
holder.messageTo.setTypeface(holder.bold, holder.normalText);
holder.messageContent.setTypeface(holder.face, holder.normalText);
holder.date.setTypeface(holder.face, holder.normalText);
}
return convertView1;
}
只需在 getview()
方法中创建 holder 对象。