【Android】根据他人源码练习下拉刷新遇到的问题

 @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView tx=new TextView(parent.getContext());
            //在代码中创建了tx就不用在xml中创建并且在代码中find了。
                tx.setText(arr.get(position));

新建的继承了Listview的类,如果你在xml文件中去“导包”使用它的话,那么在构造方法中一定要使用含有attibuteset的构造函数!(虽然你不用它它编译的时候不会报错!)否则报错!报错的!!运行时错误!(指向main中的setcontentview方法)

使用继承自某类的自定义控件的时候,三部:xml导包,在main_activity处正常使用此控件。private 自定义 mm。mm=(自定义)find....

 

 

android:indeterminateDrawable="@drawable/shape_progress"可以在drawable中自定义xml文件设置款式~
在自定义的复合复杂view中,如果想要find自定义view的Layout的某控件,前面要加上该view的名字.view.findViewByID()
 
用view.setPadding去设置下拉框的隐藏高度,利用getHeight(在屏幕上显示的真实高度,如果没有显示出来就用不了)或者getMeasureHeight(真实的高度,无论有没有在屏幕上显示)测量的时候发现都是0的原因:
我初始化view的时候是在自定义的继承了Listview的下拉类中的构造中进行的,而这个构造又是在main的setcontentview中进行的,这个时候还没有进行渲染(onmeasure\ondraw没执行,在onresume之后才执行)。所以我们要提前手动测量。
view.measure(0,0),就能得到measureheight,height还是没有。。
  view.measure(0,0);
        viewheight=view.getMeasuredHeight();
 
ontouch里面
return super.onTouchEvent(ev);
 

 

 

  @Override
    public boolean onTouchEvent(MotionEvent ev) {
        pianyi=(int)(moveint-downint);
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downint = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                moveint = ev.getY();
                view.setPadding(0, -viewheight + pianyi, 0, 0);
                if(pianyi>viewheight) return super.onTouchEvent(ev);
                    break;
            case MotionEvent.ACTION_UP:
                upint = ev.getY();
                break;

            default:
                break;
        }
        haha();
        return super.onTouchEvent(ev);
    }

 

 

 

我在haha()方法里面加了
if(pianyi<viewheight) view.setPadding(0,-viewheight,0,0);
else view.setPadding(0,0,0,0);

 

然而,这样子很容易导致无法拖动到很远的地方,一符合else,它就立刻“弹”成0,0,0,0的样子了,根本不管我们是否正在下拉,这种体验很不好。所以我们可以在case里面直接判断,当满足条件的时候直接提前return。(这样也可以防止有的人无数次拉刷新)

 

我个人理解的监听回调方法是:在自定义类中,如果满足了某个条件需要监听可以发生变动的,可以在下面写上

if(listener!=null) listener.method();//这里的method是调用了接口里面的某方法!感觉已经是固定写法了。

 
如果监听到“刷新”状态,就会在调用监听的main中重新加载一些东西拉,当然啊,adapter中是不可以直接添加的,要通知它我们添加了元素!
 
	@Override
			public void onRefresh() {
				new Thread(){
					public void run() {
						try {
							Thread.sleep(2000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}

						listDatas.add(0,"我是下拉刷新出来的数据!");
						
						runOnUiThread(new Runnable() {
							
							@Override
							public void run() {
								adapter.notifyDataSetChanged();
							自定义.onRefreshComplete();//不加这个的话就会在加载完数据的时候下拉刷新列表不隐藏,所以要在自定义中自创一个方法,让状态回到最初隐藏~
							}
						});
					};
					
				}.start();
			}

下拉加载可以直接实现onscrollListener接口

 
 
 
setSelection(getCount()); // 跳转到最后一条, 使其显示出加载更多.(不太懂)
如果没有这个那么在下拉的时候可能看不到 加载更多 ,虽然它的确有

 

这个代码挺好玩的~~很值得借鉴!

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值