ViewFlipper-----AdapterViewFlipper公告栏

本文介绍了如何使用ViewFlipper替代ViewPager+Fragment来创建一个类似学校公告栏的功能,该功能能自动检查新数据并动态添加或删除。在实际操作中,遇到ViewPager缓存和动态更新数据的问题,以及WebView在BaseAdapter中获取高度的难题。通过ViewFlipper,这些问题得到了解决,同时还分享了一个简单的Demo供读者参考。

1简介

之前因为项目的要求, 需要做一个类似于学校公告栏这么的一个东西(展示公告信息同时每隔多少秒访问一下后台查看是否有新数据若有《动态的添加删除数据》如若数据过长自动下拉到底换页)当时我第一感想就是用viewpager+fragment 于是就动手写了起来 后来才发现 viewpager+fragment 写起来没这么简单 涉及到 viewpager缓存问题和动态更新数据问题 ,还有webview 在BaseAdapter 里的getView获取不到getMeasureHeight(网上一些有关这些问题的相关资料乱七八糟) 想了想换了其他控件 实现了。  于是乎简单的介绍一下吧!小demo 如下

测试的时候先添加再删除 删除的是第三个元素(2)

package com.refl.wind.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterViewFlipper;
import android.widget.Button;
import android.widget.ScrollView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener ,MyVfAdapter.callback {
    private Button b1, b2;
    private AdapterViewFlipper adapterViewFlipper;
    private MyVfAdapter myVfAdapter;
    private ArrayList<String> mlist;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1 = (Button) findViewById(R.id.b1);
        b2 = (Button) findViewById(R.id.b2);
        adapterViewFlipper = (AdapterViewFlipper) findViewById(R.id.flipper);
        b1.setOnClickListener(this);
        b2.setOnClickListener(this);
        myVfAdapter = new MyVfAdapter(MainActivity.this);
        mlist = new ArrayList<>();


        for (int i = 0; i < 2; i++) {
            mlist.add(i + Text.tstr());
        }
        myVfAdapter.add(mlist);
        myVfAdapter.SetCallBack(this);
        adapterViewFlipper.setAdapter(myVfAdapter);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.b1:
                mlist.add("-------->添加数据");
                myVfAdapter.updata(mlist);
                break;

            case R.id.b2:
                mlist.remove(2);
                myVfAdapter.updata(mlist);
                break;

        }
    }

    @Override
    public void getCaback(boolean tag) {
        if(tag==true){
            adapterViewFlipper.startFlipping();
        }else {
            adapterViewFlipper.stopFlipping();
        }
    }
}

第二页

package com.refl.wind.myapplication;

import android.content.Context;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MyVfAdapter extends BaseAdapter {
    private Context context;
    private List<String> list;
    private List<String> Temlist = new ArrayList<>();
    private Handler mhandler;
    private ViewHolder mViewHolder;

    public MyVfAdapter(Context context) {
        this.context = context;
        mhandler = new Handler();
    }

    public void add(List<String> list) {
        this.list = list;
    }

    public void updata(List<String> list) {

        if (list.size() == 0) {
            list.add("&&&");
            this.list.addAll(list);
            notifyDataSetChanged();
        }
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        if (convertView == null) {
            mViewHolder = new ViewHolder();
            convertView = View.inflate(context, R.layout.vp_item, null);
            mViewHolder.TXT = (TextView) convertView.findViewById(R.id.TXT);
            mViewHolder.TXT.setTextSize(35);
            mViewHolder.scrollView = (ScrollView) convertView.findViewById(R.id.mscrollView);
            convertView.setTag(mViewHolder);
        } else {
            mViewHolder = (ViewHolder) convertView.getTag();
        }
        if (getCount() > 0) {
            mViewHolder.TXT.setText(list.get(position).toString());
        }
        if (myRunnable != null) {
            myRunnable = null;
        } else {
            myRunnable = new myRunnable();
        }
        mhandler.post(myRunnable);
        return convertView;
    }

    class ViewHolder {
        public TextView TXT;
        private ScrollView scrollView;
    }

    //回调s
    private callback mCallback;
    public interface callback {
        public void getCaback(boolean tag);
    }
    public void SetCallBack(callback mCallback) {
        this.mCallback = mCallback;
    }

    private myRunnable myRunnable;
    class myRunnable implements Runnable {
        @Override
        public void run() {
            // 判断高度
            int off = mViewHolder.TXT.getMeasuredHeight() - mViewHolder.scrollView.getHeight();
            if (off > 0) {
                mViewHolder.scrollView.scrollBy(0, 30);
                if (mViewHolder.scrollView.getScrollY() == off) {
                    Toast.makeText(context, mViewHolder.scrollView.getScrollY() + ":::" + mViewHolder.TXT.getMeasuredHeight() + ":::" + off,Toast.LENGTH_SHORT).show();
                    Log.d("Tag", mViewHolder.scrollView.getScrollY() + ":::" + mViewHolder.TXT.getMeasuredHeight() + ":::" + off);
                    Thread.currentThread().interrupt();
                    mCallback.getCaback(true);
                    MyVfAdapter.this.list.addAll(MyVfAdapter.this.list.size(), MyVfAdapter.this.Temlist);
                    notifyDataSetChanged();
                } else {
                    mCallback.getCaback(false);
                    mhandler.postDelayed(this, 1000);
                }

            } else {
                mCallback.getCaback(true);
                MyVfAdapter.this.list.addAll(MyVfAdapter.this.list.size(), MyVfAdapter.this.Temlist);
                notifyDataSetChanged();
            }
          Toast.makeText(context, mViewHolder.scrollView.getScrollY() + ":::" + mViewHolder.TXT.getMeasuredHeight() + ":::" + off,Toast.LENGTH_SHORT).show();
            Log.d("Tag", mViewHolder.scrollView.getScrollY() + ":::" + mViewHolder.TXT.getMeasuredHeight() + ":::" + off);
        }
    }
}

<LinearLayout 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:fitsSystemWindows="true"
    android:orientation="vertical">

    <ScrollView
        android:id="@+id/mscrollView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/TXT"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />

    </ScrollView>

</LinearLayout>

<LinearLayout 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:fitsSystemWindows="true"
    android:orientation="vertical">

    <AdapterViewFlipper
        android:id="@+id/flipper"
        android:layout_width="match_parent"
        android:layout_height="338dp"
        android:layout_alignParentTop="true"
        android:layout_marginTop="10dp"
        android:flipInterval="3000" />

    <Button
        android:id="@+id/b1"
        android:text="动态添加"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        />

    <Button
        android:text="动态删除"
        android:id="@+id/b2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

滚到底部自动换屏可以动态添加数据

这里的TextView 可以获取getMeasureHeight  换成webview 便获取不到 挺坑的 延时5秒便可获取到 可能加载网络问题吧


说的这么多demo最重要 如若帮到各位码友们 给个好评在下面  谢谢

代码下载点击打开链接



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值