精华内容
下载资源
问答
  •  但是我在公司项目的时候,我的listview有几个item,只有一个item数据需要实时更新,其它都是图片跟文字,不需要更新。因为要实时更新,所以要不停的调用notifyDateSetChanged刷新数据。这样会不停的重新绘制整个...

    扣扣技术交流群:460189483

    对于ListView数据的刷新大家都知道,改变Adapter的数据源,然后调用Adapter的notifyDateSetChanged()方法即可。

      但是我在做公司项目的时候,我的listview有几个item,只有一个item数据需要实时更新,其它都是图片跟文字,不需要更新。因为要实时更新,所以要不停的调用notifyDateSetChanged刷新数据。这样会不停的重新绘制整个listview的界面,性能开销非常大。而且item有图片的话,每个item的图片都需要重新加载,就算图片做了内存缓存,刷新一下图片也会闪一下,不停的刷新就会导致各个item的图片不停的闪,体验一点都不好。

      那么对于上面问题,有没有解决办法呢?当然是有的。我们可以针对某一个item进行局部更新,而不影响其它没有修改的item。那么具体如何实现的呢?有两种实现方式,一种是使用ListView适配器中的ViewHolder找到TextView,另一种是通过API找到,代码见如下

    private void updateItem(int itemIndex){
        if(listView == null){
            return;
        }
        //获取第一个可以看到的item位置
        int firstVisiblePosition=listView.getFirstVisiblePostion();
        //获取最后一个可以看到的item位置
        int lastVisiblePosition=listView.getLastVisiblePostion();
        //判断是否在范围内
        if ((itemIndex >= firstVisiblePosition && itemIndex<=lastVisiblePosition) {
            //得到要更新的item的view
            View view = listView.getChildAt(itemIndex - firstVisiblePosition);
            
            //方法一:获取ViewHolder,间接获取TextView
            ViewHolder viewHolder = (ViewHolder)view.getTag();
            //获取TextView
            TextView tv_item = viewHolder.tv_item;
            //更改数据,其实两步可以合并一步viewHolder.tv_item.setText("hello")
            tv_item.setText("hello");
            
            //方法二,直接获取TextView
            TextView tv_item = view.findViewById(R.id.tv_item);
            tv_item.setText("hello");
            }
    }

    2种方法哪种更高效留给自己考虑,亲测都没有问题

    我个人比较倾向于使用第一种,可扩展性比较强!

    如果要把ListView中所有需要实时显示的item都更改怎么弄呢?其实只需要稍微修改就可以了,见如下代码:

    private void updateItem(){
        if(listView == null){
            return;
        }
        //获取第一个可以看到的item位置
        int firstVisiblePosition=listView.getFirstVisiblePostion();
        //获取最后一个可以看到的item位置
        int lastVisiblePosition=listView.getLastVisiblePostion();
        //判断是否在范围内
        for (int i = firstVisiblePosition; i <= lastVisiblePosition; i++) {
            //得到要更新的item的view
            View view = listView.getChildAt(i);
            
            //方法一:获取ViewHolder,间接获取TextView
            ViewHolder viewHolder = (ViewHolder)view.getTag();
            //获取TextView
            TextView tv_item = viewHolder.tv_item;
            //更改数据,其实两步可以合并一步viewHolder.tv_item.setText("hello")
            tv_item.setText("hello");
            
            //方法二,直接获取TextView
            TextView tv_item = view.findViewById(R.id.tv_item);
            tv_item.setText("hello");
            }
    }

     

    展开全文
  • 如何实现在一个ScrollView里添加多个ListView,并且让ListView伸张到最长。用最外层ScrollView滚动条。ListView本身不滚动。全世界最简单的办法:复写ListView里面的onMeasure方法,设置让其不滚动! public void ...

    如何实现在一个ScrollView里添加多个ListView,并且让ListView伸张到最长。
    用最外层ScrollView做滚动条。ListView本身不滚动。

    全世界最简单的办法:

    复写ListView里面的onMeasure方法,设置让其不滚动!

      public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
                int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                                MeasureSpec.AT_MOST);
                super.onMeasure(widthMeasureSpec, expandSpec);
    
       }

    好傻,指标不治本,这要是listview数据一多,直接卡死。还是得用recycleview,自定义type,或者head,就可以应付一些日常的界面布局
     

    展开全文
  • 有很多人在使用listview的时候都不知道如何一个控件布局或者添加到listview的上方,实现listview滑动时,头部会有一个view跟随者上下移动,在这里我写了一个案例, 这个案例大体就是在头部加了个viewpager实现轮播...

    有很多人在使用listview的时候都不知道如何将一个控件布局或者添加到listview的上方,实现listview滑动时,头部会有一个view跟随者上下移动,在这里我写了一个案例,

    这个案例大体就是在头部加了个viewpager实现轮播图的同时,绑定listview,

    大家在添加头的时候需要注意的一点就是,如果要添加,请添加布局,不要单独的将控件添加进去,那样后期会非常被动,

    这里只做了头部的,还有底部的和头部类似,只是需要listview.addFllow(),方法不同,自然效果不同。


    首先,先展示效果:

    如图:因为使用的轮播图样式,所以图片不一致,大体细节不在描述,重在技术核心listView.addhead

    在这里我使用了网络获取轮播图片,如果不需要网络获取,忽略掉LoadData()方法;

    将listview添加一个头,但是注意布局,

    大家看代码吧,如果有不懂得可以问我,,牢记两个方法:

    listView.addHeaderView(headerView),
    
    
    
    
    
    
    listView.addFooterView(footerView);



    代码如下:

    1,Main方法中:


    package com.yz.myviewpagertest;
    
    import android.os.Handler;
    import android.os.Message;
    
    import android.os.Bundle;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.ListView;
    
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    import com.squareup.okhttp.OkHttpClient;
    import com.squareup.picasso.Picasso;
    import com.yz.myviewpagertest.helper.JsonHelper;
    import com.yz.myviewpagertest.helper.OkHttpClientHelper;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
        public static final String PATH = "http://dailyapi.ibaozou.com/api/v31/documents/latest";
        private ViewPager viewPager_main;
        private List<BaozouBean.TopStoriesBean> top_stories = new ArrayList<>();
        private List<ImageView> imageV_list = new ArrayList<>();
        private MyPagerAdatper adapter;
        private List<ImageView> dot_list = new ArrayList<>();
        private LinearLayout lin;
        private int position = 0;
        private ListView list_view_main;
        private ArrayAdapter<String> arr_adapter;
        private String[] str = {"呵呵", "和蔼", "中国", "呵呵", "和蔼", "中国", "呵呵", "和蔼", "中国", "呵呵", "和蔼", "中国"};
        private Handler handle = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case 1:
                        reset();
                        dot_list.get(position).setImageResource(R.mipmap.social_page_indicator_selected);
                        viewPager_main.setCurrentItem(position);
                        position++;
                        if (position >= dot_list.size()) {
                            position = 0;
                        }
                        handle.sendEmptyMessageDelayed(1, 2000);
    
                        break;
                }
    
    
            }
        };
    
        private void reset() {
            for (ImageView dot : dot_list
                    ) {
                dot.setImageResource(R.mipmap.social_page_indicator);
            }
    
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
            LoadData();
    
        }
    
        private void LoadData() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        String json_str = OkHttpClientHelper.getStringFromURL(MainActivity.this, PATH, "path_photo");
                        BaozouBean baozouBean = new Gson().fromJson(json_str, new TypeToken<BaozouBean>() {
                        }.getType());
                        top_stories = baozouBean.getTop_stories();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //将数据源进行填充
                                for (BaozouBean.TopStoriesBean top_bean : top_stories
                                        ) {
                                    //填充图片
                                    ImageView imageV = new ImageView(MainActivity.this);
                                    Picasso.with(MainActivity.this).load(top_bean.getImage()).into(imageV);
                                    imageV_list.add(imageV);
                                    //填充点的个数;
                                    ImageView image_dot = new ImageView(MainActivity.this);
    
                                    image_dot.setImageResource(R.mipmap.social_page_indicator);
                                    image_dot.setClickable(true);
                                    lin.addView(image_dot);
                                    dot_list.add(image_dot);
    
                                }
                                adapter.notifyDataSetChanged();
                                handle.sendEmptyMessage(1);
    
                            }
                        });
    
    
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
            }).start();
    
    
        }
    
        private void initView() {
            View head_view = LayoutInflater.from(this).inflate(R.layout.viewpager_headforlistview, null);
            list_view_main = (ListView) findViewById(R.id.listview_main);
            lin = (LinearLayout) head_view.findViewById(R.id.lin);
            viewPager_main = (ViewPager) head_view.findViewById(R.id.viewpager_main);
            adapter = new MyPagerAdatper(top_stories, this, imageV_list);
            viewPager_main.setAdapter(adapter);
            list_view_main.addHeaderView(head_view);
            arr_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, str);
            list_view_main.setAdapter(arr_adapter);
        }
    
    }
    



    2,轮播图适配器:

    package com.yz.myviewpagertest;
    
    import android.content.Context;
    import android.support.v4.view.LayoutInflaterCompat;
    import android.support.v4.view.PagerAdapter;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    
    import com.squareup.picasso.Picasso;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by Administrator on 2016/11/5.
     */
    public class MyPagerAdatper extends PagerAdapter {
        private List<BaozouBean.TopStoriesBean> top_stories;
        private Context context;
        private List<ImageView> imageV_list;
    
        public MyPagerAdatper(List<BaozouBean.TopStoriesBean> top_stories, Context context, List<ImageView> imageV_list) {
            this.top_stories = top_stories;
            this.context = context;
            this.imageV_list = imageV_list;
        }
    
        @Override
        public int getCount() {
            return imageV_list.size();
        }
    
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
    
        }
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            ImageView imageView = imageV_list.get(position);
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);
            container.addView(imageView);
            return imageView;
        }
    }
    



    3,main布局:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.yz.myviewpagertest.MainActivity">
     <ListView
         android:id="@+id/listview_main"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
    
     </ListView>
    
    </RelativeLayout>
    


    4,viewpager布局:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
    
        android:layout_height="200dp">
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager_main"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:background="#00f">
    
    
        </android.support.v4.view.ViewPager>
    
        <LinearLayout
            android:id="@+id/lin"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:layout_alignParentBottom="true"
            android:gravity="center_horizontal"
            android:orientation="horizontal">
    
        </LinearLayout>
    
    
    </RelativeLayout>








    展开全文
  • listview每个item中都有一个videoview,如何做到点击一个播放的同时其他的item的videoview全都暂停,而且正在播放的videoview如果滑动到不可见也让他暂停,求思路
  • ①Item布局,层级越少越好,使用hierarchyview工具查看优化。 ②复用convertView ③使用ViewHolder 减少find view by id ④item中有图片时,异步加载 Picasso ⑤快速滑动时,不加载图片 ⑥item中有图片时,应对图片...

    ①Item布局,层级越少越好,使用hierarchyview工具查看优化。
    ②复用convertView
    ③使用ViewHolder 减少find view by id
    ④item中有图片时,异步加载 Picasso
    ⑤快速滑动时,不加载图片
    ⑥item中有图片时,应对图片进行适当压缩 Picasso
    ⑦实现数据的分页加载

    展开全文
  • 我最近在做一个小项目,使用了bmob后端云,方便了很多,其中遇到一个问题就是从数据库查询到数据之后如何让刚发表的帖子显示在listview列表的顶端也就是从上至下排序,其实很简单,在查询的时候写上这么一句代码...
  • 上面是一个固定的模块,比如展示个人信息等,下面是一个ListView列表。如果是这样的话,不需要在外层用ScrollView包裹。这样本身就很不稳定,比如监听、展示的列表数据不全等等。改用ListView的addHeaderView()这...
  • 我想的是listview的每个item中都有一个进度条 点击item启动下载 刷新单个item用的上面一种方法 点击item记录一个Index = position 然后在接收progress进度值的handler里面调用这个 adapter.updataView(Index, ...
  • ItemContainerGenerator是一个用来包装数据的类,负责把数据转换(包装)成UI元素,维护多项控件的数据视图(例如,ContainerFromElement)与相应 项之间的关联,代表多项控件生成 项。MSDN里面对...
  • ①Item布局,层级越少越好,使用hierarchyview工具查看优化。 ②复用convertView ③使用ViewHolder ④item中有图片时,异步加载 ⑤快速滑动时,不加载图片 ⑥item中有图片时,应对图片进行适当压缩 ⑦实现数据...
  • 最近在项目时候,遇见一个需求,听上去还听简答的,Listview中肯定是有很多个item的,如何在每个item中设置多个按钮呢?设置一个的很简答,但是设置两个三个以及多个的呢?肯定是自己重新定义item布局再重写adpter...
  • android默认的ScrollView、ListView在最顶端下拉或者最底端上拉的时候,都不会带有反弹效果,很生硬的让你不能继续...那么我们今天的目标是句话实现,如何呢 我们还是先看下代码: [java] view
  • 上拉下拉加载的listview中会遇到这问题,如何判断呢? listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) ...
  • 做一个题库app,想要在listview中选择自己要修改的项并在dialog中对项中的数据进行修改,但因为不知道怎么dialog中的数据传递回选中项中,有点无从下手的感觉。 edit_question.class代码如下: public ...
  • 有时候我们需要实现listview嵌套...其实直接一个xml布局加两句话就妥妥的了,我的是:&lt;ListView android:id="@+id/attention_list_view2" android:layout_width="match_parent" ...
  • listview

    千次阅读 2016-04-25 19:42:05
    今天遇到了一个问题,就是listview设置他的每一项的点击事件时无论如何都不能toast出来,我当时第一反应是是不是我的item项有问题,但一检查又好像没问题,但就是出不来,后来自己查了下百度,有个帖子写到,出现...
  • ListView 本源码研究在Delphi环境下如何让PopupMenu与ListView的各个子项关联起来,有时我们在菜单的时候想让PopupMenu的的各个子项与ListView的各个子项关联,就是说想让PopupMenu的菜单出来,就必须在ListView...
  • 目前我用的是highlight属性,呈现的是currentItem会在一个带颜色矩形中。
  • 这算是刚到实习公司接触到的第一个任务。公司某一产品中某个界面的listView快速滑动会有卡顿的现象发生,我的任务就是解决它。 产生原因分析 我一开始的想法比较简单,可能是listview的优化没有到位,例如...
  • 因为按钮本身也在listview一个item里,所以需要在adapter里的getView方法里这么写这么:   public View getView(final int position, View convertView, ViewGroup parent) { // TODO Aut
  • 我自定义了一个ListView布局,想在里面添加一个CheckBox按钮,我遇到了下面的第二个问题,虽然有解决方法但不知道具体怎么,最好能给个完整的例子,谢谢大家了!  1、ListView item中加入checkbox后...
  • listview如何实现圆角

    2012-09-05 17:32:59
    首先呢,我们还是看几个示图:(这是360推出的一款天气预报APP(墨迹),很不错的一款哦,这里为她们做一个免费广告,哈哈.)     这种带有圆角的listview' 看起来很棒吧,确实是这样,其实也不能这么说,主要...
  • 前段时间了个项目是在一个搜索界面上方显示历史搜索记录,下方显示的是搜索出来的物品,需求是物品数量不确定所以需要使用ListView,可以滑动显示,又不可以只滑动物品,也要相应可以将上方的历史记录共同滑动隐藏,所以...
  • 关于Android Studio如何在Listview中删除指定控件的问题 我写这篇博客是因为我们安卓的大作业要做一个记账的APP,其中...一开始我想了很多的方法,比如说嵌套Listview,就是在一个Listview中嵌套另一个Listview(据...
  • 最近在做一个跟蓝牙有关的应用,其中就有蓝牙扫描连接的一个步骤,蓝牙扫描的时候在listview里面会不断的加载扫描到的数据,实际测试的时候发现周围设备到10多20多个的时候,重复扫描几次listView的加载就会变得卡顿...
  • 最近2个月一直忙着项目,一个是挑战杯的互联网专项赛事,最终获得了国家三等奖。另一个是湖南省程序设计大赛应用开发类。终于忙完了。其中需要在listview中嵌入viewpager。于是网上学习了下。主要在第一个item中...
  • ListView一直是Android里的一大难题,之前一段时间项目碰到一个需求:点击item后控制item中的ImageView显示正在播放的图片,其他item中的imageView则都显示未播放的图片。下面给出一个例子来实现这种效果。首先看...
  • ListView如何在后台管理ListItems(UI Objects)以及如何提升ListView的性能以获得更好的用户体验,对于Android开发者来说是一个极其重要的话题,也是一个非常有趣的话题。 受 Google IO 演讲的启发

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 593
精华内容 237
关键字:

如何做一个listview