从数据库中删除后如何刷新或更新片段

时间:2019-05-27 19:18:42

标签: java android android-fragments

我是android开发的新手,我正在尝试编写一本简单的赞美诗书, 我正在使用底部导航,我在每个选项卡上使用片段来显示每个赞美诗的编号和标题。 在我最喜欢的片段中,我使用从数据库中获取的回收器视图显示了喜欢的歌曲列表。 我使用长按侦听器从数据库的收藏夹表中删除歌曲,但是任何时候我删除一个 我最喜欢的片段不会随着当前项目而刷新或更新。请,我如何刷新或更新 每当我删除歌曲时,我最喜欢的片段。谢谢!

'''收藏夹适配器''

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()));
        }


    }

1 个答案:

答案 0 :(得分:0)

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

首先创建一个侦听器:

public interface UpdateListener {

        void onValueChangedListener();
    }

初始化来自片段的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;
}

在片段中实现侦听器,然后重新初始化列表。

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();

    }
    }