收藏时会判断失误,然后出现重复收藏的情况
首次点击收藏时运行良好,再次点击时也能判断出已收藏。但是在上下页翻动后,判断是否收藏的机制出现异常。之后任意一篇点击收藏后再次点击收藏也能再次收藏,甚至是同篇的多次收藏。
1 | MainActivity.java<br> package com.example.self_application_homework.activity;<br><br> import androidx.appcompat.app.AppCompatActivity;<br><br> import android.content.Intent;<br> import android.database.Cursor;<br> import android.database.sqlite.SQLiteDatabase;<br> import android.os.Bundle;<br> import android.util.Log;<br> import android.view.View;<br> import android.widget.Button;<br> import android.widget.ImageView;相关截图:<br> import android.widget.TextView;<br> import android.widget.Toast;<br><br> import com.example.self_application_homework.R;<br> import com.example.self_application_homework.bean.Article;<br> import com.example.self_application_homework.biz.ArticleBiz;<br> import com.example.self_application_homework.dao.ArticleDao;<br> import com.example.self_application_homework.dao.ArticleDbHelper;<br> import com.example.self_application_homework.utils.ImageLoader;<br><br> import java.io.Serializable;<br> import java.util.ArrayList;<br> import java.util.List;<br><br> public class MainActivity extends AppCompatActivity {<br><br> private Button mBtnDeleteDb;<br><br> private Button mBtnLastOne, mBtnCollect, mBtnNextOne;<br> private TextView mTvMyfavourites, mTvTitle, mTvAuthor, mTvContent;<br> private ImageView mIvAdvertise;<br><br> // for advertisement bitmap<br> private ImageLoader imageLoader;<br><br> // for current page article<br> int currentPage = 1;<br> private ArticleBiz mArticleBiz = new ArticleBiz();<br> private ArticleDao mArticleDao = new ArticleDao();<br> private Article article = new Article();<br><br> // for MyFavourites<br> Intent itToMyFavourites = null;<br> List<Article> articleList = new ArrayList<>();<br><br> private static final String TAG = "MainActivity -app";<br><br> @Override<br> protected void onCreate(Bundle savedInstanceState) {<br> super.onCreate(savedInstanceState);<br> setContentView(R.layout.activity_main);<br><br> initViewsNDatas();<br><br> loadAdvertisement();<br><br> loadDatas(currentPage, false);<br> }<br><br> private void initViewsNDatas() {<br> mBtnLastOne = findViewById(R.id.id_btn_lastOne);<br> mBtnCollect = findViewById(R.id.id_btn_collect);<br> mBtnNextOne = findViewById(R.id.id_btn_nextOne);<br> mTvMyfavourites = findViewById(R.id.id_tv_myFavourites);<br> mTvTitle = findViewById(R.id.id_tv_title);<br> mTvAuthor = findViewById(R.id.id_tv_author);<br> mTvContent = findViewById(R.id.id_tv_content);<br> mIvAdvertise = findViewById(R.id.id_iv_advertise);<br><br> itToMyFavourites = new Intent(MainActivity.this, MyFavouritesActivity.class);<br><br> mBtnDeleteDb = findViewById(R.id.id_btn_deleteDb);<br> }<br><br> public void initEvenets(View v) {<br> switch (v.getId()) {<br> case R.id.id_tv_myFavourites:<br> // 打开收藏页面<br> if (mArticleDao.loadFromDb(this).isEmpty())<br> Toast.makeText(this, "还没收藏任何内容", Toast.LENGTH_SHORT).show();<br> else<br> startActivity(itToMyFavourites);<br> break;<br> case R.id.id_btn_lastOne:<br> // 打开上一页<br> Log.d(TAG, "currentPage: " + currentPage);<br> loadDatas(loadPage(false), true);<br> break;<br> case R.id.id_btn_collect:<br> // 点击收藏按钮<br> List<Article> articleList = mArticleDao.loadFromDb(this);<br><br> // 先判断收藏里(数据库)是否为空,为空直接添加数据,不为空则进一步判断<br> if (articleList.isEmpty() || articleList == null) {<br> mArticleDao.insertToDb(this, article);<br> Toast.makeText(this, "收藏成功", Toast.LENGTH_SHORT).show();<br> Log.d(TAG, "articleList.isEmpty(): " + articleList.isEmpty());<br> } else {<br> // 收藏中有相同的文章则跳过,否则添加巾数据库<br> for (Article articleInLoop : articleList) {<br> Log.d(TAG, "article.getTitle().equals(articleInLoop.getTitle()): " + article.getTitle().equals(articleInLoop.getTitle()));<br> if (article.getTitle().equals(articleInLoop.getTitle())) {<br> Toast.makeText(this, "此文章已收藏", Toast.LENGTH_SHORT).show();<br> } else {<br> mArticleDao.insertToDb(this, article);<br> Toast.makeText(this, "收藏成功", Toast.LENGTH_SHORT).show();<br> }<br> }<br> }<br> break;<br> case R.id.id_btn_nextOne:<br> // 打开下一页<br> loadDatas(loadPage(true), true);<br> break;<br> case R.id.id_btn_deleteDb:<br> // 删库<br> mArticleDao.deleteDb(this);<br> Toast.makeText(this, "数据库已清空", Toast.LENGTH_SHORT).show();<br> break;<br> }<br> }<br><br> private void loadAdvertisement() {<br> imageLoader = new ImageLoader();<br> int random = (int) (3 * Math.random() + 1);<br> imageLoader.loadImageByAsynTask(mIvAdvertise, "http://www.imooc.com/api/teacher?type=1", random);<br> }<br><br> private void loadDatas(int page, boolean isUseCache) {<br> mArticleBiz.loadDatas(new ArticleBiz.Callback() {<br> @Override<br> public void onSuccess(Article resultArticle) {<br> article = resultArticle;<br> mTvTitle.setText(article.getTitle());<br> mTvAuthor.setText(article.getAuthor());<br> mTvContent.setText(article.getContent());<br> }<br><br> @Override<br> public void onFailure(Exception ex) {<br> ex.printStackTrace();<br> }<br> }, page, isUseCache);<br> }<br><br> private int loadPage(boolean nextPage) {<br> if (nextPage == true)<br> currentPage++;<br> else<br> currentPage--;<br><br> if (currentPage < 1)<br> currentPage = 30;<br> if (currentPage > 30)<br> currentPage = 1;<br><br> return currentPage;<br> }<br><br>}<br> |
1 | ArticleDao.java<br> package com.example.self_application_homework.dao;<br><br> import android.content.ContentValues;<br> import android.content.Context;<br> import android.database.Cursor;<br> import android.database.sqlite.SQLiteDatabase;<br><br> import androidx.annotation.NonNull;<br><br> import com.example.self_application_homework.bean.Article;<br><br> import java.util.ArrayList;<br> import java.util.List;<br><br> public class ArticleDao {<br> public List<Article> loadFromDb( @NonNull Context context) {<br><br> ArticleDbHelper dbHelper = ArticleDbHelper.getInstance(context);<br> SQLiteDatabase db = dbHelper.getWritableDatabase();<br><br> List<Article> articleList = new ArrayList<>();<br><br> Cursor cursor = db.rawQuery( "SELECT * FROM " + Article.TABLE_NAME, null );<br> Article article = null ;<br> while (cursor.moveToNext()) {<br> int id = cursor.getInt(cursor.getColumnIndex(Article.COL_ID));<br> String title = cursor.getString(cursor.getColumnIndex(Article.COL_TITLE));<br> String author = cursor.getString(cursor.getColumnIndex(Article.COL_AUTHOR));<br> String content = cursor.getString(cursor.getColumnIndex(Article.COL_CONTENT));<br> article = new Article(title, author, content);<br> articleList.add(article);<br> }<br> cursor.close();<br><br> return articleList;<br> }<br><br> public void insertToDb( @NonNull Context context, Article article) {<br><br> if (article == null ) {<br> return ;<br> }<br><br> ArticleDbHelper dbHelper = ArticleDbHelper.getInstance(context);<br> SQLiteDatabase db = dbHelper.getWritableDatabase();<br><br> db.beginTransaction();<br><br> ContentValues contentValues = null ;<br> contentValues = new ContentValues();<br> contentValues.put(Article.COL_TITLE, article.getTitle());<br> contentValues.put(Article.COL_AUTHOR, article.getContent());<br> contentValues.put(Article.COL_CONTENT, article.getAuthor());<br> db.insertWithOnConflict(Article.TABLE_NAME, null , contentValues, SQLiteDatabase.CONFLICT_REPLACE);<br><br> db.setTransactionSuccessful();<br> db.endTransaction();<br> }<br><br> public void deleteDb( @NonNull Context context) {<br> ArticleDbHelper dbHelper = ArticleDbHelper.getInstance(context);<br> SQLiteDatabase db = dbHelper.getWritableDatabase();<br> db.execSQL( "DELETE FROM " + Article.TABLE_NAME);<br> }<br>}<br> |
20
收起
正在回答 回答被采纳积分+1
1回答
2.Android 网络操作与流行框架
- 参与学习 人
- 提交作业 220 份
- 解答问题 1800 个
本阶段是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理;从文件存储、到轻量级数据库SQLite的使用;最后利用最流程的第三方框架助你快速开发企业级APP。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧