前言:基於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) {
}
}