android - ListView 项目在 ArrayAdapter 上混淆

标签 android

我正在为我的ListView使用ArrayAdapter,第一次所有内容都显示正确,问题是ListView在我滚动浏览它。 所以我找到了使用ViewHolder的解决方案,最后我的ListView可以平滑滚动,但有一个缺点,我的ListView上的项目混淆了。

我该如何解决这个问题?

这是我的 ArrayAdaptergetView() 方法:

public class VideoLocationAdapter extends ArrayAdapter<VideoLocationDB> {
        public ImageLoader imageLoader;
        ImageLoader loader = null;

        public VideoLocationAdapter(Context context, int resource,
                VideoLocationDB[] videoLocationDBs) {
            super(context, resource, videoLocationDBs);
            loader = new ImageLoader(context);
        }

        private LayoutInflater layoutInflator;

        @Override
        public View getView(final int position, View convertView,
                ViewGroup parent) {

            FeedViewHolder feedViewHolder;

            if (convertView == null) {

                convertView = LocationsListActivity.this.getLayoutInflater()
                        .inflate(R.layout.listitems, null, true);

                feedViewHolder = new FeedViewHolder();
                feedViewHolder.titleView = (TextView) convertView.findViewById(R.id.txt_title);
                feedViewHolder.descView = (TextView) convertView.findViewById(R.id.txt_list_desc);
                feedViewHolder.more = (TextView) convertView.findViewById(R.id.txt_more);
                feedViewHolder.distanceView = (TextView) convertView.findViewById(R.id.txt_distance);
                feedViewHolder.v  = (ImageView) convertView.findViewById(R.id.image);

                final VideoLocationDB vidLocation = videoLocationsDB[position];

                // Image
                String url = vidLocation.documentary_thumbnail_url;
                String name = vidLocation.name;
                feedViewHolder.v.setTag(url);

                loader.DisplayImage(url, LocationsListActivity.this, feedViewHolder.v, name);

                // Title        
                String title = vidLocation.name;
                feedViewHolder.titleView.setText(title.toUpperCase());
                Typeface fontRegular = Typeface.createFromAsset(getAssets(),
                        "miso.otf");
                feedViewHolder.titleView.setTypeface(fontRegular);

                // Description          
                String desc = vidLocation.text;
                feedViewHolder.descView.setText(desc);
                Typeface fontLight = Typeface.createFromAsset(getAssets(),
                        "miso-light.otf");
                feedViewHolder.descView.setTypeface(fontLight);

                // More     
                feedViewHolder.more.setText(getString(R.string.de_list_more));
                feedViewHolder.more.setTypeface(fontLight);

                // Distance
                feedViewHolder.distanceView.setTypeface(fontRegular);

                if (location != null) {
                    double lat = location.getLatitude();
                    double lng = location.getLongitude();

                    double lat2 = roundDown(vidLocation.latitude);
                    double lng2 = roundDown(vidLocation.longitude);

                    if (countDistance(lat, lng, lat2, lng2) >= 500) {
                        double kilometer = countDistance(lat, lng, lat2, lng2) / 1000;
                        int decimalPlaces = 1;
                        BigDecimal decimal = new BigDecimal(kilometer);
                        decimal = decimal.setScale(decimalPlaces,
                                BigDecimal.ROUND_HALF_UP);
                        double new_km = decimal.doubleValue();
                        feedViewHolder.distanceView.setText(new_km + " km");
                    } else {
                        int decimalPlaces = 1;
                        BigDecimal decimal = new BigDecimal(countDistance(lat, lng,
                                lat2, lng2));
                        decimal = decimal.setScale(decimalPlaces,
                                BigDecimal.ROUND_HALF_UP);
                        double meter = decimal.doubleValue();
                        feedViewHolder.distanceView.setText(meter + " m");
                    }
                    videoLocationAdapter.notifyDataSetChanged();
                }

                convertView.setTag(feedViewHolder);

            } else
            {
                feedViewHolder = (FeedViewHolder) convertView.getTag();
            }
            return convertView; 
            }

static class FeedViewHolder{

        TextView titleView;
        TextView descView;
        TextView more;
        TextView distanceView;
        ImageView v;
    }

最佳答案

您已将文本设置在 if if (convertView == null) {} 之外/之后

如果(convertView == null){ //创建 View }别的 { //从convertView获取 View }

此处设置 View 中的文本

http://android.amberfog.com/?p=296

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
            System.out.println("getView " + position + " " + convertView);
            ViewHolder holder = null;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.item1, null);
                holder = new ViewHolder();
                holder.textView = (TextView)convertView.findViewById(R.id.text);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }

         holder.textView.setText(mData.get(position));//<========== see it .....
            return convertView;
        }

    }

将此代码放在 if/else 之后

 final VideoLocationDB vidLocation = videoLocationsDB[position];

                // Image
                String url = vidLocation.documentary_thumbnail_url;
                String name = vidLocation.name;
                feedViewHolder.v.setTag(url);

                loader.DisplayImage(url, LocationsListActivity.this, feedViewHolder.v, name);

                // Title        
                String title = vidLocation.name;
                feedViewHolder.titleView.setText(title.toUpperCase());
                Typeface fontRegular = Typeface.createFromAsset(getAssets(),
                        "miso.otf");
                feedViewHolder.titleView.setTypeface(fontRegular);

                // Description          
                String desc = vidLocation.text;
                feedViewHolder.descView.setText(desc);
                Typeface fontLight = Typeface.createFromAsset(getAssets(),
                        "miso-light.otf");
                feedViewHolder.descView.setTypeface(fontLight);

                // More     
                feedViewHolder.more.setText(getString(R.string.de_list_more));
                feedViewHolder.more.setTypeface(fontLight);

                // Distance
                feedViewHolder.distanceView.setTypeface(fontRegular);

                if (location != null) {
                    double lat = location.getLatitude();
                    double lng = location.getLongitude();

                    double lat2 = roundDown(vidLocation.latitude);
                    double lng2 = roundDown(vidLocation.longitude);

                    if (countDistance(lat, lng, lat2, lng2) >= 500) {
                        double kilometer = countDistance(lat, lng, lat2, lng2) / 1000;
                        int decimalPlaces = 1;
                        BigDecimal decimal = new BigDecimal(kilometer);
                        decimal = decimal.setScale(decimalPlaces,
                                BigDecimal.ROUND_HALF_UP);
                        double new_km = decimal.doubleValue();
                        feedViewHolder.distanceView.setText(new_km + " km");
                    } else {
                        int decimalPlaces = 1;
                        BigDecimal decimal = new BigDecimal(countDistance(lat, lng,
                                lat2, lng2));
                        decimal = decimal.setScale(decimalPlaces,
                                BigDecimal.ROUND_HALF_UP);
                        double meter = decimal.doubleValue();
                        feedViewHolder.distanceView.setText(meter + " m");
                    }
                    videoLocationAdapter.notifyDataSetChanged();
                } 

关于android - ListView 项目在 ArrayAdapter 上混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10817238/

相关文章:

JavaPoet + Android Studio "addModifiers(Modifier) cannot be applied to Modifier"

android - 解析深层链接中的数据

java - 使用 onGroupClick 和 onChildClick 搜索可扩展 ListView 显示错误结果

java - 自定义流媒体实现

android - 在 Android Studio 中创建一个 android 模型类

android - Joda Time 不工作

android - 调用需要 api 级别 24(当前最小值为 21)新的 android.icu.text.DecimalFormat

Android QuickBlox getFile 响应问题

android - manifest.xml XML 解析错误 : not well-formed

android - AdMob 中介(Android 和 iOS): how to force a network to test it?