java - 从数据库中删除后如何刷新或更新 fragment

标签 java android android-fragments

我是 Android 开发新手,我正在尝试构建一本简单的赞美诗书, 我使用底部导航,我使用每个选项卡上的 fragment 来显示每首赞美诗的编号和标题。 在我最喜欢的 fragment 中,我使用从数据库中获取的回收器 View 显示了最喜欢的歌曲列表。 我使用长按监听器从数据库中最喜欢的表中删除歌曲,但任何时候我删除 我最喜欢的歌曲 fragment 不会随着当前项目而刷新或未注明日期。请问如何刷新或更新 每当我删除歌曲时我最喜欢的 fragment 。谢谢你!

'''最喜欢的适配器''

import android.app.FragmentManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

import static android.content.Context.MODE_PRIVATE;

public class FavouriteAdapter extends RecyclerView.Adapter<FavouriteAdapter.ViewHolder> {

    private Context favContext;
    private ArrayList<String> favNumbers = new ArrayList<>();
    private ArrayList<String> favTitles  = new ArrayList<>();

    public FavouriteAdapter(Context favContext, ArrayList<String> favNumbers, ArrayList<String> favTitles) {
        this.favContext = favContext;
        this.favNumbers = favNumbers;
        this.favTitles = favTitles;
    }

    @Override
    public FavouriteAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.favourite_list_items, parent, false);

        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(final FavouriteAdapter.ViewHolder holder, final int position) {

        holder.textViewFavNum.setText(favNumbers.get(position));
        holder.textViewFavTitle.setText(favTitles.get(position));
        final String hymn_no = favNumbers.get(position);
        holder.itemView.setTag(favNumbers.get(position));

        holder.favParentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i;
                i = new Intent(view.getContext(), Songs.class);
                i.putExtra("numId", favNumbers.get(position));
                i.putExtra("titleName", favTitles.get(position));
                favContext.startActivity(i);

            }
        });


      holder.favParentLayout.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(final View view) {
                new AlertDialog.Builder(view.getContext())
                        .setIcon(android.R.drawable.ic_dialog_alert)
                        .setTitle("Are you sure?")
                        .setMessage("Do you want to delete from favorites?")
                        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int which) {


                                try{

                                    SQLiteDatabase favHymns = favContext.openOrCreateDatabase("Songs", MODE_PRIVATE, null);

                                    favHymns.execSQL("DELETE FROM favorites where hymnNum = '"+hymn_no+"'");

                                    Toast.makeText(favContext.getApplicationContext(), "hymn deleted ", Toast.LENGTH_LONG).show();

                                }catch(Exception e){
                                    e.printStackTrace();
                                }



                            }




                        })

                        .setNegativeButton("No", null)
                        .show();


                return true;


            }


        });


    }

    @Override
    public int getItemCount() {

        return favNumbers.size();

    }

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

    @Override
    public int getItemViewType(int position){
        return position;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public TextView textViewFavNum;
        public TextView textViewFavTitle;
        RelativeLayout favParentLayout;
        public ViewHolder(View itemView) {
            super(itemView);

            textViewFavNum = (TextView) itemView.findViewById(R.id.textViewFavNum);
            textViewFavTitle = (TextView) itemView.findViewById(R.id.textViewFavTitle);
            favParentLayout  =  (RelativeLayout) itemView.findViewById(R.id.favParentLayout);
        }
    }
}

'''favourite fragment'''

    import android.app.FragmentManager;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import android.widget.Toast;

    import java.util.ArrayList;
    import java.util.logging.Handler;

    import static android.content.Context.MODE_PRIVATE;


    /**
     * A simple {@link Fragment} subclass.
     */
    public class Favourites extends Fragment {


        private RecyclerView recyclerView;
        private RecyclerView.Adapter adapter;
        private ArrayList<String> favSongNumbers = new ArrayList<>();
        private ArrayList<String> favSongTitles  = new ArrayList<>();
        private TextView favMessage;



        public Favourites() {
            // Required empty public constructor
        }

        View view;
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            if(view == null) {
                view = inflater.inflate(R.layout.fragment_favourites, container, false);
                favMessage = (TextView) view.findViewById(R.id.favMessage);
                recyclerView = (RecyclerView) view.findViewById(R.id.favRecyclerView);
                //  adapter.setHasStableIds(true);


                Toast.makeText(this.getActivity(), "Long press to delete hymns from favorites", Toast.LENGTH_LONG).show();

                initFavSongs();

            }


            return view;
        }

        private void initFavSongs(){



            try{

                favMessage.setText("");

                SQLiteDatabase favHymns = this.getActivity().openOrCreateDatabase("Songs", MODE_PRIVATE, null);

                Cursor c = favHymns.rawQuery("SELECT  hymnNum, hymnTitle FROM favorites", null);

                int hymnNumIndex = c.getColumnIndex("hymnNum");
                int hymnTitleIndex = c.getColumnIndex("hymnTitle");

                if(c.moveToFirst()) {

                    while (c != null) {

                        favSongNumbers.add(Integer.toString(c.getInt(hymnNumIndex)) + ". ");
                        favSongTitles.add(" " + c.getString(hymnTitleIndex));

                        c.moveToNext();
                    }

                }else{
                    favMessage.setText("Oops!No favorite songs added yet.");
                }


            }catch (Exception e){

                e.printStackTrace();

            }


            initRecyclerView();
        }

        private void initRecyclerView(){

            adapter = new FavouriteAdapter(this.getActivity(), favSongNumbers, favSongTitles);
            recyclerView.setAdapter(adapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));
        }


    }

最佳答案

将监听器传递给适配器,并在从数据库中删除项目时调用它。然后更新您的列表和适配器。像这样:

首先创建一个监听器:

public interface UpdateListener {

        void onValueChangedListener();
    }

在来自fragment的Adapter类中初始化监听器。

private UpdateListener updateListener;

     public FavouriteAdapter(Context favContext, ArrayList<String> favNumbers, ArrayList<String> favTitles,UpdateListener updateListener ) {
            this.favContext = favContext;
            this.favNumbers = favNumbers;
            this.favTitles = favTitles;
    this.updateListener=updateListener;

        }


    holder.favParentLayout.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(final View view) {
                    new AlertDialog.Builder(view.getContext())
                            .setIcon(android.R.drawable.ic_dialog_alert)
                            .setTitle("Are you sure?")
                            .setMessage("Do you want to delete from favorites?")
                            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int which) {


                                    try{

                                        SQLiteDatabase favHymns = favContext.openOrCreateDatabase("Songs", MODE_PRIVATE, null);

                                        favHymns.execSQL("DELETE FROM favorites where hymnNum = '"+hymn_no+"'");

                                        Toast.makeText(favContext.getApplicationContext(), "hymn deleted ", Toast.LENGTH_LONG).show();
// when any item delete from database notify the fragment through this 
  //  listener for updating your adapter
    updateListener.onValueChangedListener();


                                    }catch(Exception e){
                                        e.printStackTrace();
                                    }


                                }


                            })

                            .setNegativeButton("No", null)
                            .show();


                    return true;


                }


            });

//更新适配器需要此方法

public void update(ArrayList<String> favNumbers, ArrayList<String> favTitles){
this.favNumbers = favNumbers;
                this.favTitles = favTitles;
}

在您的 fragment 中实现监听器并重新初始化您的列表。

public class Favourites extends Fragment implements UpdateListener { 

    private void initRecyclerView(){
// pass listener
        adapter = new FavouriteAdapter(this.getActivity(), favSongNumbers, favSongTitles,this);

    }

private void updateFavSongs(){

favSongNumbers.clear;
favSongTitles.clear;



            try{

                favMessage.setText("");

                SQLiteDatabase favHymns = this.getActivity().openOrCreateDatabase("Songs", MODE_PRIVATE, null);

                Cursor c = favHymns.rawQuery("SELECT  hymnNum, hymnTitle FROM favorites", null);

                int hymnNumIndex = c.getColumnIndex("hymnNum");
                int hymnTitleIndex = c.getColumnIndex("hymnTitle");

                if(c.moveToFirst()) {

                    while (c != null) {

                        favSongNumbers.add(Integer.toString(c.getInt(hymnNumIndex)) + ". ");
                        favSongTitles.add(" " + c.getString(hymnTitleIndex));

                        c.moveToNext();
                    }

                }else{
                    favMessage.setText("Oops!No favorite songs added yet.");
                }


            }catch (Exception e){

                e.printStackTrace();

            }
         adapter.update(favSongNumbers,favSongTitles);
         adapter.notifyDataSetChanged()

        }
    @Override
        public void onValueChangedListener(){
                    updateFavSongs();

    }
    }

关于java - 从数据库中删除后如何刷新或更新 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56331424/

相关文章:

android-fragments - nestedscrollview 内 RecyclerView 的 onBindViewHolder 立即为所有项目调用

android - isValidFragment Android API 19

android Lollipop 动画故障

java - 从数组中获取索引并转换它

android - 无法使用 Firebase 控制台发送数据消息

java - Java 函数式接口(interface)中的 Lambda

java - 亚马逊应用内购买

android - 在android的ImageView中添加gif图像

java - 寻找独立的 JSP 编译器

java - 一组随机字符和数字的正则表达式