Android 仿微信公衆號推送 通知顯示,刷新

前言:基於Bmob圖文消息功能,佈局主要是MaterialRefreshLayout+RecyclerView+CardView

MaterialRefreshLayout:一個下拉刷新控件;

RecyclerView:用於大量數據展示的新控件RecylerView,可以用來代替傳統的ListView,更加強大和靈活。

CardView:Google 官方發佈 MD 風格卡片佈局控件

效果圖:

數據庫:

新數據庫:這個和之前的推送可結合。

數據可刷新:

MaterialRefreshLayout導包:

  implementation 'com.cjj.materialrefeshlayout:library:1.3.0'

 Fragment_chat.xml(通知總佈局)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:background="@color/white"
              tools:context=".ChatFragment">
    <com.cjj.MaterialRefreshLayout
        android:id="@+id/refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/tz_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>


    </com.cjj.MaterialRefreshLayout>


</LinearLayout>

item_tz.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:gravity="center_horizontal"
              android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/item_time"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="time"
            />
    </LinearLayout>

    <androidx.cardview.widget.CardView
        android:id="@+id/cardview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="12dp"
        android:layout_marginRight="15dp"
        android:layout_marginBottom="12dp"
        app:cardBackgroundColor="@color/white"
        app:cardCornerRadius="10dp"
        app:cardElevation="10dp"
        app:contentPadding="8dp"
        >


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="6dp"
            android:layout_marginRight="10dp"
            android:orientation="vertical">


            <ImageView
                android:id="@+id/item_im"
                android:layout_width="match_parent"
                android:layout_height="120dp"
                android:layout_gravity="center_vertical"
                android:layout_margin="6dp"
                android:scaleType="centerCrop"
                app:srcCompat="@mipmap/ic_launcher_round"/>

            <TextView
                android:id="@+id/item_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Title"
                android:textColor="#383838"
                android:textSize="18sp"
                android:textStyle="bold"/>


            <TextView
                android:id="@+id/item_desc"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:text="desc"
                android:textColor="#545454"
                android:textSize="16sp"/>

        </LinearLayout>

    </androidx.cardview.widget.CardView>

</LinearLayout>

MyAdapter.java

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>  {

    private LayoutInflater mInflater;
    private List<BmobArticle> mLists;
    private OnItemClickListener mListener;

    public void setLists(List<BmobArticle> lists) {
        mLists = lists;
    }

    public interface OnItemClickListener {
        void onClick(View v, int position);

    }
    public MyAdapter(OnItemClickListener listener) {
        mListener = listener;
    }

    public OnItemClickListener getListener() {
        return mListener;
    }

    public void setListener(OnItemClickListener listener) {
        mListener = listener;
    }

    public List<BmobArticle> getLists() {
        return mLists;
    }

    public void addLists(List<BmobArticle> lists) {
        addLists(0, lists);
    }

    public void addLists(int position, List<BmobArticle> lists) {

        if (lists != null && lists.size() > 0) {
            mLists.addAll(lists);
            notifyItemRangeChanged(position, mLists.size());
        }
    }
    public void removeData(List<BmobArticle> lists,int position) {
        lists.remove(position);
        notifyItemRemoved(position);
    }


    public MyAdapter(List<BmobArticle> items) {
        mLists = items;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        mInflater = LayoutInflater.from(parent.getContext());
        View view = mInflater.inflate(R.layout.item_tz, null);

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


            }
        });
        return new MyViewHolder(view);

    }
    class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView item_title;
        private TextView item_desc;
        private ImageView item_im;
        private TextView item_time;
        private CardView mCardView;
        public MyViewHolder(View itemView) {
            super(itemView);
            item_title = (TextView) itemView.findViewById(R.id.item_title);
            item_desc = (TextView) itemView.findViewById(R.id.item_desc);
            item_im = (ImageView) itemView.findViewById(R.id.item_im);
            item_time =(TextView) itemView.findViewById(R.id.item_time);
            mCardView=(CardView)itemView.findViewById(R.id.cardview);
        }
    }



    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
      //  holder.item_title.setText(mLists.get(position));
        BmobArticle mBmobArticle=mLists.get(position);
        String s_title=mBmobArticle.getTitle();
        String s_desc=mBmobArticle.getDesc();
        String s_time=mBmobArticle.getUpdatedAt();
        String imageurl=mBmobArticle.getCover();

        //在消息隊列中實現對控件的更改
        Handler handle = new Handler() {
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case 0:
                        Bitmap bmp=(Bitmap)msg.obj;
                        holder.item_im.setImageBitmap(bmp);
                        break;
                }
            };
        };
       String imageUrl=imageurl.replaceAll("http://bmob-cdn-25347.b0.upaiyun.com","http://jn.philuo.com");
        new Thread(new Runnable() {
            @Override
            public void run() {
                Bitmap bmp = getURLimage(imageUrl);
                Message msg = new Message();
                msg.what = 0;
                msg.obj = bmp;
                handle.sendMessage(msg);
            }
        }).start();
        holder.item_title.setText(s_title);
        holder.item_desc.setText(s_desc);
        holder.item_time.setText(s_time);

        holder.mCardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int position = holder.getAdapterPosition();
                    BmobArticle mBmobArticle=mLists.get(position);
                    String O_title=mBmobArticle.getTitle();
                    String O_url=mBmobArticle.getUrl();
                    String O_Url=O_url.replaceAll("http://bmob-cdn-25347.b0.upaiyun.com","http://jn.philuo.com");
                    Log.i("msg", O_title);
                    Log.i("msg", O_Url);
                    Intent intent = new Intent(view.getContext(), WebviewActivity.class);
                    Bundle B = new Bundle();
                    B.putString("name", O_title);
                    B.putString("url", O_Url);
                    intent.putExtra("data", B);
                    view.getContext().startActivity(intent);

                    mListener.onClick(holder.itemView, position);
                }
        });

    }



    private Bitmap getURLimage(String imageUrl) {
        Bitmap bmp = null;
        try {
            URL myurl = new URL(imageUrl);
            // 獲得連接
            HttpURLConnection conn = (HttpURLConnection) myurl.openConnection();
            conn.setConnectTimeout(6000);//設置超時
            conn.setDoInput(true);
            conn.setUseCaches(false);//不緩存
            conn.connect();
            InputStream is = conn.getInputStream();//獲得圖片的數據流
            bmp = BitmapFactory.decodeStream(is);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bmp;
    }


    @Override
    public int getItemCount() {
        return mLists.size();
    }
    
}

ChatFragment.java

public class ChatFragment extends Fragment  implements View.OnClickListener{
    private MaterialRefreshLayout mRefreshLayout;
    private RecyclerView mRecyclerView;

    private List<BmobArticle> datas = new ArrayList<>();
    private List<BmobArticle> mList = new ArrayList<>();
    private MyAdapter mAdapter;

    private boolean isLoadMore = true;

    public ChatFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_chat, container, false);
        initView(view);
        initDatas();

        mAdapter.setListener(new MyAdapter.OnItemClickListener() {
            @Override
            public void onClick(View v, int position) {
              //  Toast.makeText(getActivity(),"您點擊了"+position+"行",Toast.LENGTH_SHORT).show();

            }
        });

        return view;
    }

    private void initView(View view) {
        mRecyclerView=(RecyclerView)view.findViewById(R.id.tz_recyclerview);
        mRefreshLayout=(MaterialRefreshLayout)view.findViewById(R.id.refresh);
        initRefresh();

    }


    private void initRefresh() {

        mAdapter = new MyAdapter(datas);
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        mRefreshLayout.setLoadMore(false);
        mRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {

            @Override
            public void onRefresh(MaterialRefreshLayout materialRefreshLayout) {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        refreshDatas();
                        mRefreshLayout.finishRefresh();
                    }
                }, 3000);

            }



        });
    }

    /**
     *初始化數據
     */
    private void initDatas() {
        BmobQuery<BmobArticle> bmobArticleBmobQuery = new BmobQuery<>();
        bmobArticleBmobQuery.findObjects(new FindListener<BmobArticle>() {
            @Override
            public void done(List<BmobArticle> object, BmobException e) {
                if (e == null) {
                    Log.i("log","查詢成功"+object.size());
                    datas=object;
                    mAdapter.setLists(datas);
                    mRecyclerView.setAdapter(mAdapter);
                } else {
                    Log.i("log","查詢失敗"+e.getMessage());
                    Toast.makeText(getActivity(), "請檢查網絡是否連通", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

    /**
     *刷新數據
     */
    private void refreshDatas() {
        BmobQuery<BmobArticle> bmobArticleBmobQuery = new BmobQuery<>();
        bmobArticleBmobQuery.findObjects(new FindListener<BmobArticle>() {
            @Override
            public void done(List<BmobArticle> object, BmobException e) {
                if (e == null) {
                    Log.i("log","查詢成功"+object.size());
                    Log.i("log","obj"+object);
                    Log.i("log","data"+datas);
                    if (datas.size()==object.size()){
                        Toast.makeText(getActivity(), "已經沒有更多數據了", Toast.LENGTH_SHORT).show();
                    }else {
                        mList=object;
                        mAdapter.setLists(mList);
                        mAdapter.notifyDataSetChanged();
                    }

                } else {
                    Log.i("log","查詢失敗"+e.getMessage());
                    Toast.makeText(getActivity(), "請檢查網絡是否連通", Toast.LENGTH_SHORT).show();
                }
            }
        });


    }
    @Override
    public void onClick(View view) {

    }


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章