(仿头条APP项目)6.点击过的新闻列表文字变灰和下拉刷新与滚动加载新闻数据
生活随笔
收集整理的這篇文章主要介紹了
(仿头条APP项目)6.点击过的新闻列表文字变灰和下拉刷新与滚动加载新闻数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一.點擊過的新聞列表文字變灰
- 效果圖
- 實現思路
- 導入ormlite數據庫類依賴
- 利用ormlite創建數據庫和表
- 創建數據庫類MyDbHelper
- 創建數據庫中的新聞實體類NewInfo
- 頁面事務代碼編寫
- 列表點擊事件
- 在getView中判斷列表內容是否被點擊過
- 創建queryIdInDb方法查詢當前新聞是否存在數據庫中
- 根據是否存在數據庫表來改變標題與日期的顏色
- 二.下拉刷新與滾動加載新聞數據
- 效果圖
- 實現思路
- MyApi中添加獲取下一頁url地址的類
- 頁面事務代碼編寫
- 添加滾動與下拉刷新器
- 下拉刷新
- 滾動加載
- 總代碼
一.點擊過的新聞列表文字變灰
效果圖
實現思路
- 創建列表點擊事件利用數據庫存儲點擊過的新聞數據ID,通過判斷數據庫中是否有相應的新聞數據ID來決定文字變灰(已查看)。
導入ormlite數據庫類依賴
implementation ‘com.j256.ormlite:ormlite-android:5.0’
利用ormlite創建數據庫和表
創建數據庫類MyDbHelper
import android.content.Context; import android.database.sqlite.SQLiteDatabase;import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils;import java.sql.SQLException;public class MyDbHelper extends OrmLiteSqliteOpenHelper {//創建數據庫public MyDbHelper(Context context) {super(context, "new", null, 1);}@Overridepublic void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {//創建表try {TableUtils.createTable(connectionSource,NewInfo.class);} catch (SQLException e) {e.printStackTrace();}}@Overridepublic void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {} }創建數據庫中的新聞實體類NewInfo
import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable;//定義數據庫中的新聞實體類 @DatabaseTable(tableName = "news_table") public class NewInfo {@DatabaseField(columnName = "id",generatedId = true)public Integer id;@DatabaseField(columnName = "newsId")public Integer newsId;//在表中有這個newId,表示已被讀過,否則未讀public NewInfo(Integer newsId) {//自己調用,newsId為NewListData的新聞idthis.newsId = newsId;}public NewInfo() {//框架調用}@Overridepublic String toString() {return "NewInfo{" +"id=" + id +", newId=" + newsId +'}';} }頁面事務代碼編寫
列表點擊事件
//9.監聽列表點擊private void onliseners() {//9.1點擊監聽器pullToRefreshListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//由于pullToRefreshListView本身算一條,所以從1開始NewListData.DataBean.NewsBean bean = adapter.getListData().get(position-1); // Toast.makeText(getContext(),"id="+bean.id,Toast.LENGTH_SHORT).show();//9.2使用數據庫保存起來MyDbHelper myDbHelper = new MyDbHelper(getContext());Dao<NewInfo, Integer> dao = null;try {//dao是有增刪改查方法的對象dao = myDbHelper.getDao(NewInfo.class);List<NewInfo> list = dao.queryForEq("newsId",bean.id);//select語句if(list == null||list.size()==0) {//執行一條insert語句dao.create(new NewInfo(bean.id));}System.out.println(dao.queryForAll().toString());//9.6調用adapter的notifyDataSetChanged方法更新數據adapter.notifyDataSetChanged();} catch (SQLException e) {e.printStackTrace();}}});}在getView中判斷列表內容是否被點擊過
//判斷列表內容是否被點擊過boolean isExist = false;try {isExist = queryIdInDb(newsBean.id);} catch (SQLException e) {e.printStackTrace();}if(type==0){//一圖//添加isExist參數判斷是否被點擊過return setDataToOneView(convertView, newsBean,isExist);}else {//三圖return setDataToThreeView(convertView, newsBean,isExist);}創建queryIdInDb方法查詢當前新聞是否存在數據庫中
//9.3查詢當前新聞是否存在數據庫中MyDbHelper myDbHelper;Dao<NewInfo,Integer> dao;private boolean queryIdInDb(int id) throws SQLException {if (myDbHelper == null){myDbHelper= new MyDbHelper(getContext());dao = myDbHelper.getDao(NewInfo.class);}List<NewInfo> list = dao.queryForEq("newsId",id);if(list == null ||list.size()==0){return false;//表示不存在數據庫中,沒有點擊過}else {return true;}}根據是否存在數據庫表來改變標題與日期的顏色
holderOne.date.setTextColor(isExist? Color.GRAY : Color.BLACK);holderOne.title.setTextColor(isExist? Color.GRAY : Color.BLACK);二.下拉刷新與滾動加載新聞數據
效果圖
實現思路
- 下拉刷新:1.清空集合。2.添加數據。3.刷新列表。4.關閉等待。
- 滾動加載:1.不清空集合。2.添加數據。3.刷新列表。4.關閉等待。
MyApi中添加獲取下一頁url地址的類
public interface MyApi {//注解與方法組成實現類@GET("home.json")public Call<ResponseData> getType();@GET("10007/list_1.json")public Call<NewListData> getNewList();//獲取下一頁url地址@GETpublic Call<NewListData> getMoreData( @Url String loadMoreUrl);//將baseurl地址和變量組成新地址 }頁面事務代碼編寫
添加滾動與下拉刷新器
//10.下拉刷新與滾動加載private void setDataToView(NewListData.DataBean data) {//10.1判斷控件是否為空,為空才初始化if(pullToRefreshListView == null){//查找空間pullToRefreshListView = fragmentView.findViewById(R.id.pull_listview);//賦值一個適配器adapter = new NewListAdapter(data.news);pullToRefreshListView.setAdapter(adapter);//列表點擊變灰事件onliseners();//10.2給列表添加滾動與下拉的刷新監聽器onlistenerspull(pullToRefreshListView);}}下拉刷新
@Overridepublic void onPullDownToRefresh(final PullToRefreshBase<ListView> refreshView) {//下拉//請求成功retrofit.create(MyApi.class).getNewList().enqueue(new Callback<NewListData>() {@Overridepublic void onResponse(Call<NewListData> call, Response<NewListData> response) {//10.5保存下一頁的地址loadMoreUrl = response.body().data.more;//10.4:請求到服務端數據后,先清空集合,再添加數據,再刷新列表,關閉等待if(adapter!=null){adapter.getListData().clear();//清空adapter.getListData().addAll(response.body().data.news);adapter.notifyDataSetChanged();//刷新//結束刷新refreshView.onRefreshComplete();Toast.makeText(getContext(),"已刷新頁面",Toast.LENGTH_SHORT).show();}}@Overridepublic void onFailure(Call<NewListData> call, Throwable t) {}});滾動加載
@Overridepublic void onPullUpToRefresh(final PullToRefreshBase<ListView> refreshView) {//滾動//10.4 滾動加載需要使用loadMoreUrl地址區的下一頁數據retrofit.create(MyApi.class).getMoreData(loadMoreUrl).enqueue(new Callback<NewListData>() {@Overridepublic void onResponse(Call<NewListData> call, Response<NewListData> response) {if(adapter!=null){adapter.getListData().addAll(response.body().data.news);adapter.notifyDataSetChanged();refreshView.onRefreshComplete();Toast.makeText(getContext(),"已顯示下一頁數據",Toast.LENGTH_SHORT).show();}}@Overridepublic void onFailure(Call<NewListData> call, Throwable t) {}});總代碼
import android.graphics.Color; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast;import com.bumptech.glide.Glide; import com.example.administrator.zhjrtt.R; import com.google.gson.Gson; import com.handmark.pulltorefresh.library.PullToRefreshBase; import com.handmark.pulltorefresh.library.PullToRefreshListView; import com.j256.ormlite.dao.Dao; import com.xzit.bean.NewListData; import com.xzit.db.MyDbHelper; import com.xzit.db.NewInfo; import com.xzit.fragment.BaseFragment; import com.xzit.net.MyApi;import java.sql.SQLException; import java.util.List;import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory;//1.繼承BaseFragment public class Page1Fragment extends BaseFragment {// 10.5 定義一個變量保存下一頁的url地址private String loadMoreUrl= null;// 2.重寫getMyView//3.布局列表View fragmentView;@Overrideprotected View getMyView() {//4.加載布局fragmentView = View.inflate(getContext(), R.layout.fragment_new_list,null);return fragmentView;}//5.請求服務端數據@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);//6.執行請求retrofit.create(MyApi.class).getNewList().enqueue(new Callback<NewListData>() {@Overridepublic void onResponse(Call<NewListData> call, Response<NewListData> response) {//將請求的數據傳給視圖setDataToView(response.body().data);//10.5保存下一頁的地址loadMoreUrl = response.body().data.more;}@Overridepublic void onFailure(Call<NewListData> call, Throwable t) {}});}//7.顯示PullToRefreshListView pullToRefreshListView;NewListAdapter adapter;//10.下拉刷新與滾動加載private void setDataToView(NewListData.DataBean data) {//10.1判斷控件是否為空,為空才初始化if(pullToRefreshListView == null){//查找空間pullToRefreshListView = fragmentView.findViewById(R.id.pull_listview);//賦值一個適配器adapter = new NewListAdapter(data.news);pullToRefreshListView.setAdapter(adapter);//列表點擊變灰事件onliseners();//10.2給列表添加滾動與下拉的刷新監聽器onlistenerspull(pullToRefreshListView);}}private void onlistenerspull(PullToRefreshListView pullToRefreshListView) {//10.3設置模式為BOTHpullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {@Overridepublic void onPullDownToRefresh(final PullToRefreshBase<ListView> refreshView) {//下拉//請求成功retrofit.create(MyApi.class).getNewList().enqueue(new Callback<NewListData>() {@Overridepublic void onResponse(Call<NewListData> call, Response<NewListData> response) {//10.5保存下一頁的地址loadMoreUrl = response.body().data.more;//10.4:請求到服務端數據后,先清空集合,再添加數據,再刷新列表,關閉等待if(adapter!=null){adapter.getListData().clear();//清空adapter.getListData().addAll(response.body().data.news);adapter.notifyDataSetChanged();//刷新//結束刷新refreshView.onRefreshComplete();Toast.makeText(getContext(),"已刷新頁面",Toast.LENGTH_SHORT).show();}}@Overridepublic void onFailure(Call<NewListData> call, Throwable t) {}});}@Overridepublic void onPullUpToRefresh(final PullToRefreshBase<ListView> refreshView) {//滾動//10.4 滾動加載需要使用loadMoreUrl地址區的下一頁數據retrofit.create(MyApi.class).getMoreData(loadMoreUrl).enqueue(new Callback<NewListData>() {@Overridepublic void onResponse(Call<NewListData> call, Response<NewListData> response) {if(adapter!=null){adapter.getListData().addAll(response.body().data.news);adapter.notifyDataSetChanged();refreshView.onRefreshComplete();Toast.makeText(getContext(),"已顯示下一頁數據",Toast.LENGTH_SHORT).show();}}@Overridepublic void onFailure(Call<NewListData> call, Throwable t) {}});}});}//9.監聽列表點擊private void onliseners() {//9.1點擊監聽器pullToRefreshListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//由于pullToRefreshListView本身算一條,所以從1開始NewListData.DataBean.NewsBean bean = adapter.getListData().get(position-1); // Toast.makeText(getContext(),"id="+bean.id,Toast.LENGTH_SHORT).show();//9.2使用數據庫保存起來MyDbHelper myDbHelper = new MyDbHelper(getContext());Dao<NewInfo, Integer> dao = null;try {//dao是有增刪改查方法的對象dao = myDbHelper.getDao(NewInfo.class);List<NewInfo> list = dao.queryForEq("newsId",bean.id);//select語句if(list == null||list.size()==0) {//執行一條insert語句dao.create(new NewInfo(bean.id));}System.out.println(dao.queryForAll().toString());//9.6調用adapter的notifyDataSetChanged方法更新數據adapter.notifyDataSetChanged();} catch (SQLException e) {e.printStackTrace();}}});}class ViewHolderOne{public TextView title;public TextView date;public ImageView image;}class ViewHolderThree extends ViewHolderOne{public ImageView image1;public ImageView image2;}//8.定義適配器class NewListAdapter extends BaseAdapter {private List<NewListData.DataBean.NewsBean> listData;public List<NewListData.DataBean.NewsBean> getListData() {return listData;}public NewListAdapter(List<NewListData.DataBean.NewsBean> list) {listData = list;}@Overridepublic int getViewTypeCount() {//返回兩種視圖,一種是一圖的,一種是三圖的return 2;}@Overridepublic int getItemViewType(int position) {NewListData.DataBean.NewsBean bean = listData.get(position);if(bean.type==0){//一圖return 0;//R.layout.item_new_one.xml}else {//三圖return 1;R.layout.item_new_three.xml}}@Overridepublic int getCount() {return listData.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolderOne holderOne = null;ViewHolderThree holderThree = null;//獲取數據NewListData.DataBean.NewsBean newsBean = listData.get(position);//判斷當前的視圖是一圖還是三圖int type = getItemViewType(position);//判斷列表內容是否被點擊過boolean isExist = false;try {isExist = queryIdInDb(newsBean.id);} catch (SQLException e) {e.printStackTrace();}if(type==0){//一圖return setDataToOneView(convertView, newsBean,isExist);}else {//三圖return setDataToThreeView(convertView, newsBean,isExist);}}@NonNullprivate View setDataToThreeView(View convertView, NewListData.DataBean.NewsBean newsBean, boolean isExist) {ViewHolderThree holderThree;if(convertView == null){convertView = View.inflate(getContext(),R.layout.item_new_three,null);holderThree = new ViewHolderThree();holderThree.title = convertView.findViewById(R.id.item_title_three);holderThree.date = convertView.findViewById(R.id.item_date_three);holderThree.image = convertView.findViewById(R.id.item_image1_three);holderThree.image1 = convertView.findViewById(R.id.item_image2_three);holderThree.image2 = convertView.findViewById(R.id.item_image3_three);convertView.setTag(holderThree);}else {holderThree = (ViewHolderThree) convertView.getTag();}holderThree.title.setText(newsBean.title);holderThree.date.setText(newsBean.pubdate);String imageUrl= "http://192.168.31.114:8080"+newsBean.listimage;String imageUrl1= "http://192.168.31.114:8080"+newsBean.listimage1;String imageUrl2= "http://192.168.31.114:8080"+newsBean.listimage2;Glide.with(getContext()).load(imageUrl).into(holderThree.image);Glide.with(getContext()).load(imageUrl1).into(holderThree.image1);Glide.with(getContext()).load(imageUrl2).into(holderThree.image2);//9.4根據是否存在數據庫表來改變標題與日期的顏色holderThree.date.setTextColor(isExist? Color.GRAY : Color.BLACK);holderThree.title.setTextColor(isExist? Color.GRAY : Color.BLACK);return convertView;}//當視圖是一張圖片時@NonNullprivate View setDataToOneView(View convertView, NewListData.DataBean.NewsBean newsBean, boolean isExist) {ViewHolderOne holderOne;if(convertView ==null){//視圖不是重用時convertView = View.inflate(getContext(),R.layout.item_new_one,null);holderOne = new ViewHolderOne();holderOne. title = convertView.findViewById(R.id.item_title);holderOne. date = convertView.findViewById(R.id.item_date);holderOne. image = convertView.findViewById(R.id.item_image);convertView.setTag(holderOne);}else {//視圖重用holderOne= (ViewHolderOne) convertView.getTag();}holderOne. title.setText(newsBean.title);holderOne. date.setText(newsBean.pubdate);String imageUrl= "http://192.168.31.114:8080"+newsBean.listimage;Glide.with(getContext()).load(imageUrl).into(holderOne.image);//9.4根據是否存在數據庫表來改變標題與日期的顏色holderOne.date.setTextColor(isExist? Color.GRAY : Color.BLACK);holderOne.title.setTextColor(isExist? Color.GRAY : Color.BLACK);return convertView;}}//9.3查詢當前新聞是否存在數據庫中MyDbHelper myDbHelper;Dao<NewInfo,Integer> dao;private boolean queryIdInDb(int id) throws SQLException {if (myDbHelper == null){myDbHelper= new MyDbHelper(getContext());dao = myDbHelper.getDao(NewInfo.class);}List<NewInfo> list = dao.queryForEq("newsId",id);if(list == null ||list.size()==0){return false;//表示不存在數據庫中,沒有點擊過}else {return true;}} }總結
以上是生活随笔為你收集整理的(仿头条APP项目)6.点击过的新闻列表文字变灰和下拉刷新与滚动加载新闻数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (仿头条APP项目)5.列表页面设计实现
- 下一篇: (Java集合框架)List接口