Java 试图在ListAdapter的getView()内设置textView的宽度

Java 试图在ListAdapter的getView()内设置textView的宽度,java,android,xml,Java,Android,Xml,因此,对于这个应用程序,我制作了一个自定义列表适配器。一切都很好,但是我的listView中每一行的textView内部的宽度不正确 这些文本视图的目的是用图像和文本来说明,喜欢和不喜欢在一个条中起作用。我无法在问题中插入图像,但我将尝试解释。我正在与150 dp合作。因此,如果一个酒吧有一个like和0个dislike,它应该是这样的 喜欢-------------- 不喜欢 请注意,没有显示不喜欢的内容 如果一个酒吧有5个喜欢和1个不喜欢,它将与150 dp成比例,因此: 喜欢-------

因此,对于这个应用程序,我制作了一个自定义列表适配器。一切都很好,但是我的listView中每一行的textView内部的宽度不正确

这些文本视图的目的是用图像和文本来说明,喜欢和不喜欢在一个条中起作用。我无法在问题中插入图像,但我将尝试解释。我正在与150 dp合作。因此,如果一个酒吧有一个like和0个dislike,它应该是这样的

喜欢-------------- 不喜欢

请注意,没有显示不喜欢的内容

如果一个酒吧有5个喜欢和1个不喜欢,它将与150 dp成比例,因此:

喜欢---------------

不喜欢---

问题在于,文本视图有时是正确的,然后随机出现如下错误幻觉:

喜欢=10

迪利克斯=0

喜欢-------

不喜欢------------------

喜欢-0

不喜欢-0

喜欢--------------------

不喜欢---------

解决方案:

public View getView(int position, View convertView, ViewGroup parent){
        View V = convertView;

        if(V == null){
            LayoutInflater vi =
                    (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            V = vi.inflate(R.layout.barlist_row, null);

        }

        BarListItem ci = mBarList.get(position);
        double likes_cnt = ci.getLikes();
        double dislikes_cnt = ci.getDislikes();

        TextView likes = (TextView)V.findViewById(R.id.prg_likes);
        TextView dislikes = (TextView)V.findViewById(R.id.prg_dislikes);
        TextView title = (TextView)V.findViewById(R.id.txt_title);
        TextView distance = (TextView)V.findViewById(R.id.txt_distance);

        if(likes_cnt > dislikes_cnt){
            Resources r = getResources();
            float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, r.getDisplayMetrics());
            likes.getLayoutParams().width = Math.round(px);
            px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150*((float)ci.getDislikes()/(float)ci.getLikes()), r.getDisplayMetrics());
            dislikes.getLayoutParams().width = Math.round(px);
        }else{
            Resources r = getResources();
            float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, r.getDisplayMetrics());
            dislikes.getLayoutParams().width = Math.round(px);
            px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,150*((float)ci.getLikes()/(float)ci.getDislikes()), r.getDisplayMetrics());
            likes.getLayoutParams().width = Math.round(px);
        }

        title.setText(ci.getTitle());
        likes.setText(" " + String.valueOf(ci.getLikes()));
        dislikes.setText(" " + String.valueOf(ci.getDislikes()));
        distance.setText(String.valueOf(ci.getDistance()) + " miles");

        return V;
    }
if(不喜欢\u cnt<1){
不喜欢。设置可见性(View.GONE);
}
否则{
不喜欢.setVisibility(View.VISIBLE);
}
if(像_cnt<1){
likes.setVisibility(View.GONE);
}
否则{
likes.setVisibility(View.VISIBLE);
}
而不是在“喜欢”为0或“不喜欢”为0时尝试将宽度设置为1或0。相反,我将视图设置为“已消失且可见”,所有这些都按照我的预期工作。谢谢你的评论

最终代码:

if(dislikes_cnt < 1){
            dislikes.setVisibility(View.GONE);
        }
        else{
            dislikes.setVisibility(View.VISIBLE);
        }
        if(likes_cnt < 1){
            likes.setVisibility(View.GONE);
        }
        else{
            likes.setVisibility(View.VISIBLE);
        }
public View getView(int位置、视图转换视图、视图组父视图){
视图V=转换视图;
如果(V==null){
放平机六=
(LayoutInflater)getSystemService(Context.LAYOUT\u flater\u SERVICE);
V=vi.充气(R.布局.条形图,空);
}
BarListItem ci=mBarList.get(位置);
long likes_cnt=ci.getLikes();
long dislikes_cnt=ci.getDislikes();
TextView likes=(TextView)V.findViewById(R.id.prg_likes);
TextView不喜欢=(TextView)V.findViewById(R.id.prg_不喜欢);
TextView title=(TextView)V.findViewById(R.id.txt_title);
TextView距离=(TextView)V.findViewById(R.id.txt_距离);
如果(喜欢>不喜欢){
Resources r=getResources();
float px=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,150,r.getDisplayMetrics());
likes.getLayoutParams().width=Math.round(px);
px=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,150*((float)dislikes_cnt/(float)likes_cnt),r.getDisplayMetrics());
不喜欢.getLayoutParams().width=Math.round(px);
}否则{
Resources r=getResources();
float px=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,150,r.getDisplayMetrics());
不喜欢.getLayoutParams().width=Math.round(px);
px=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,150*((float)likes_cnt/(float)dislikes_cnt),r.getDisplayMetrics());
likes.getLayoutParams().width=Math.round(px);
}
如果(不喜欢_cnt<1){
不喜欢。设置可见性(View.GONE);
}
否则{
不喜欢.setVisibility(View.VISIBLE);
}
if(像_cnt<1){
likes.setVisibility(View.GONE);
}
否则{
likes.setVisibility(View.VISIBLE);
}
title.setText(ci.getTitle());
likes.setText(“+String.valueOf(ci.getLikes()));
dislikes.setText(“+String.valueOf(ci.getDislikes()));
distance.setText(String.valueOf(ci.getDistance())+“miles”);
返回V;
}

您可以使用自定义进度条/分级条,并在主题中传递自己的图像。另外,由于您使用的是列表适配器,因此视图会被重复使用,因此请确保在getView()方法中重置所有TextView/ImageView。这可能是因为您没有处理
likes==dislikes
的情况。检查您的if条件。我尝试了另一段代码,在其中我处理了该条件,但没有任何区别。谢谢你,tho!我试图使用进度条,但发现我使用的宽度概念更快,更脏。因此,对于未来的应用程序或这个应用程序的未来,我将研究定制的程序条。谢谢你能详细说明一下“重置所有图像和文本视图”吗?因为我对它的工作方式还不满意
public View getView(int position, View convertView, ViewGroup parent){
        View V = convertView;

        if(V == null){
            LayoutInflater vi =
                    (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            V = vi.inflate(R.layout.barlist_row, null);

        }

        BarListItem ci = mBarList.get(position);
        long likes_cnt = ci.getLikes();
        long dislikes_cnt = ci.getDislikes();

        TextView likes = (TextView)V.findViewById(R.id.prg_likes);
        TextView dislikes = (TextView)V.findViewById(R.id.prg_dislikes);
        TextView title = (TextView)V.findViewById(R.id.txt_title);
        TextView distance = (TextView)V.findViewById(R.id.txt_distance);

        if(likes_cnt > dislikes_cnt){
            Resources r = getResources();
            float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, r.getDisplayMetrics());
            likes.getLayoutParams().width = Math.round(px);
            px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150*((float)dislikes_cnt/(float)likes_cnt), r.getDisplayMetrics());
            dislikes.getLayoutParams().width = Math.round(px);
        }else{
            Resources r = getResources();
            float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, r.getDisplayMetrics());
            dislikes.getLayoutParams().width = Math.round(px);
            px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,150*((float)likes_cnt/(float)dislikes_cnt), r.getDisplayMetrics());
            likes.getLayoutParams().width = Math.round(px);
        }

        if(dislikes_cnt < 1){
            dislikes.setVisibility(View.GONE);
        }
        else{
            dislikes.setVisibility(View.VISIBLE);
        }
        if(likes_cnt < 1){
            likes.setVisibility(View.GONE);
        }
        else{
            likes.setVisibility(View.VISIBLE);
        }
        title.setText(ci.getTitle());
        likes.setText(" " + String.valueOf(ci.getLikes()));
        dislikes.setText(" " + String.valueOf(ci.getDislikes()));
        distance.setText(String.valueOf(ci.getDistance()) + " miles");

        return V;
    }