Java Android-滚动时ListView项目样式失败
我的Java Android-滚动时ListView项目样式失败,java,android,android-listview,android-adapter,Java,Android,Android Listview,Android Adapter,我的列表视图有问题。我在几个项目中使用它们,每个项目都会出现错误 在一种情况下,每个项目都有一个唯一的图像,在另一种情况下,有些项目包含粗体文本,有些项目不包含粗体文本 当我滚动图像/粗体文本时,图像/粗体文本不在正确的位置,当我在靠近L的某个点(在案例b中)再次快速上下滚动时,所有项目均为粗体 我唯一能找到的帖子是,但它并没有解决这个问题 这是我的自定义适配器: private class MyAdapter extends BaseAdapter { private List<
列表视图有问题。我在几个项目中使用它们,每个项目都会出现错误
在一种情况下,每个项目都有一个唯一的图像,在另一种情况下,有些项目包含粗体文本,有些项目不包含粗体文本
当我滚动图像/粗体文本时,图像/粗体文本不在正确的位置,当我在靠近L的某个点(在案例b中)再次快速上下滚动时,所有项目均为粗体
我唯一能找到的帖子是,但它并没有解决这个问题
这是我的自定义适配器:
private class MyAdapter extends BaseAdapter {
private List<Object> obj;
private LayoutInflater inflater;
public MyAdapter(Context context, List<Object> obj_list) {
this.obj_list = obj_list;
this.inflater = LayoutInflater.from(context);
}
public int getCount(){
return this.obj_list.size();
}
public Object getItem(int position){
return this.obj_list.get(position);
}
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
convertView = inflater.inflate(R.layout.my_row_layout, null);
holder = new ViewHolder();
holder.item_one = (TextView)convertView.findViewById(R.id.txtItemOne);
holder.item_two = (TextView)convertView.findViewById(R.id.txtItemTwo);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
Object objectItem = getItem(position);
//here I set the boldness
if(condition) {
holder.item_one.setTypeface(null, Typeface.BOLD);
}
holder.item_one.setText(objectItem .getItemOne());
holder.item_two.setText(objectItem .getItemTwo());
return convertView;
}
class ViewHolder {
TextView hItemOne;
TextView hItemTwo;
}
}
私有类MyAdapter扩展了BaseAdapter{
私人名单;
私人充气机;
公共MyAdapter(上下文上下文,列表对象列表){
this.obj_list=obj_list;
this.inflater=layoutiner.from(上下文);
}
public int getCount(){
返回此.obj_list.size();
}
公共对象getItem(int位置){
返回此.obj_list.get(位置);
}
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
if(convertView==null){
convertView=充气机。充气(R.layout.my_row_layout,null);
holder=新的ViewHolder();
holder.item_one=(TextView)convertView.findViewById(R.id.txtItemOne);
holder.item_two=(TextView)convertView.findViewById(R.id.txtItemTwo);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
objectobjectItem=getItem(位置);
//在这里我设定了大胆
如果(条件){
holder.item_one.setTypeface(null,Typeface.BOLD);
}
holder.item_one.setText(objectItem.getItemOne());
holder.item_two.setText(objectItem.getItemTwo());
返回视图;
}
类视图持有者{
TextView hItemOne;
文本视图hItemTwo;
}
}
有人知道我可能做错了什么吗?或者至少经历过同样的问题
谢谢 问题是因为您使用的是ViewHolder模式,在ViewHolder模式中,android重复使用现有视图。所以当它重用以前生成的粗体视图时。现在,如果它尝试渲染视图但未能满足您应用的条件,则只渲染上一个粗体类型的面。因此,以下方法可以解决您的问题:
holder.item_one.setTypeface(null, Typeface.NORMAL);
//here I set the boldness
if(condition) {
holder.item_one.setTypeface(null, Typeface.BOLD);
}
问题是因为您使用的是ViewHolder模式,在ViewHolder模式中,android将重用现有视图。所以当它重用以前生成的粗体视图时。现在,如果它尝试渲染视图但未能满足您应用的条件,则只渲染上一个粗体类型的面。因此,以下方法可以解决您的问题:
holder.item_one.setTypeface(null, Typeface.NORMAL);
//here I set the boldness
if(condition) {
holder.item_one.setTypeface(null, Typeface.BOLD);
}
如果必须在某个预定义的特定位置使用粗体,请执行以下操作:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
convertView = inflater.inflate(R.layout.my_row_layout, null);
holder = new ViewHolder();
holder.item_one = (TextView)convertView.findViewById(R.id.txtItemOne);
holder.item_two = (TextView)convertView.findViewById(R.id.txtItemTwo);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
Object objectItem = getItem(position);
if(position==2 || position==5) {
holder.item_one.setTypeface(null, Typeface.BOLD);
holder.item_one.setText(objectItem .getItemOne());
}
else
holder.item_two.setText(objectItem .getItemTwo());
return convertView;
}
但请记住,如果删除“else”,则它将不起作用。如果必须在某个预定义的特定位置使用粗体,请执行以下操作:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
convertView = inflater.inflate(R.layout.my_row_layout, null);
holder = new ViewHolder();
holder.item_one = (TextView)convertView.findViewById(R.id.txtItemOne);
holder.item_two = (TextView)convertView.findViewById(R.id.txtItemTwo);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
Object objectItem = getItem(position);
if(position==2 || position==5) {
holder.item_one.setTypeface(null, Typeface.BOLD);
holder.item_one.setText(objectItem .getItemOne());
}
else
holder.item_two.setText(objectItem .getItemTwo());
return convertView;
}
但请记住,如果删除“else”,则它将不起作用
对于图像,使用ImageLoader。是我使用的,并且很容易定制
如果文本视图应为粗体,请将其设置为粗体。如果需要正常,请将其设置为正常。ListView回收视图,因此您需要为每个视图手动设置首选项
对于图像,使用ImageLoader。是我使用的,并且很容易定制
如果文本视图应为粗体,请将其设置为粗体。如果需要正常,请将其设置为正常。ListView回收视图,因此您需要为每个视图手动设置首选项
将“holder.item_one.setText(objectItem.getItemOne());”移动到if条件中。为什么?我想在任何情况下设置它…好吧,ListView适配器会回收视图位置,所以当您重新分配滚动位置时。嗯…我想是这样的。。。但是,如何使某些项加粗,而使某些项不加粗?将“holder.item_one.setText(objectItem.getItemOne());”移动到if条件中。为什么?我想在任何情况下设置它…好吧,ListView适配器会回收视图位置,所以当您重新分配滚动位置时。嗯…我想是这样的。。。但是我如何才能使一些项目加粗,一些不加粗呢?谢谢,但前面的答案到目前为止效果很好!如果我遇到问题,我会支持你的想法。不管怎样谢谢:)谢谢,但是前面的答案到目前为止效果很好!如果我遇到问题,我会支持你的想法。无论如何,谢谢你:)