один и тот же элемент добавлялся в список любимых много раз - PullRequest
0 голосов
/ 22 марта 2020

Основная деятельность


import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;

// import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Adapter;
import android.widget.Toast;

import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationView;

import java.util.ArrayList;


public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    private DrawerLayout drawer;
    public static Resources resources;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        resources = getResources();

        buildNavigationDrawer();

        BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navBar);
        bottomNavigationView.setOnNavigationItemSelectedListener(listener);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment,
                    new home()).commit();
        }
        // add content


    }

    public void buildNavigationDrawer(){
        NavigationView navigationView = findViewById(R.id.navigationView);
        navigationView.setNavigationItemSelectedListener(this);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        drawer = findViewById(R.id.drawer);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
                R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();
    }

    private BottomNavigationView.OnNavigationItemSelectedListener listener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                Fragment sFragment = null ;
                switch (item.getItemId()){
                    case R.id.nav_home:
                        sFragment = new home();
                        //Toast.makeText(getApplicationContext(),"clicked home",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.nav_fav:
                        sFragment = new favourite();
                        //Toast.makeText(getApplicationContext(),"clicked fav",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.nav_Recent:
                        sFragment = new recent();
                        //Toast.makeText(getApplicationContext(),"clicked recent",Toast.LENGTH_SHORT).show();
                        break;
                }
                assert sFragment != null;
                getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.fragment,sFragment)
                        .commit();
                //for deselecting icon in navigationDrawer
                /*
                for (int i=0 ; i<navigationView.getMenu().size();i++){
                navigationView.getMenu().getItem(i).setChecked(false);}

                 */
                return true;
            }
        };

    @Override
    public void onBackPressed() {
        if (drawer.isDrawerOpen(GravityCompat.START)){
            drawer.closeDrawer(GravityCompat.START);
        }else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {

        switch (item.getItemId()){

            case R.id.message:
                //// code for message_activity
                Intent intent = new Intent(getApplicationContext(),message.class);
                startActivity(intent);
                break;
            case R.id.facebook:
                Intent facebookIntent = new Intent("android.intent.action.VIEW", Uri.parse("https://www.facebook.com/"));
                startActivity(facebookIntent);
                break;
            case R.id.share:
                Toast.makeText(getApplicationContext(),"share bottom clicked",Toast.LENGTH_SHORT).show();
                break;
            case R.id.theme:
                //// code for theme activity
                Intent intent_1 = new Intent(getApplicationContext(),theme.class);
                startActivity(intent_1);
                break;
        }

        drawer.closeDrawer(GravityCompat.START);

        return true;
    }

    //show search bar


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.search,menu);
        return true;
    }
}

Домашний фрагмент


import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.Objects;

public class home extends Fragment {

    private RecyclerView mRecyclerView;
    private content_adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private ArrayList<content_item> allContent ;


    public home() {}
    private View rootView;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.home,container,false);
        allContent =  content.createContent();
        if (favourite.fav_list==null){
            favourite.fav_list = new ArrayList<>();
        }
        buildRecycler();
        return rootView;

    }

    private void buildRecycler(){
        mRecyclerView = rootView.findViewById(R.id.recyclerview);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(getActivity());
        mAdapter = new content_adapter(allContent);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);

        mAdapter.setOnItemClickedListener(new content_adapter.OnItemClickedListener() {
            @Override
            public void onItemClick(int position) {
                Intent intent = new Intent(getContext(),Reading.class);
                intent.putExtra("story 1", allContent.get(position).getmStory());
                startActivity(intent);
            }

            @Override
            public void onItemFavClick(int position) {

                if (favourite.fav_list.contains(allContent.get(position))){
                    Toast.makeText(getActivity(),"Already in favourite list",Toast.LENGTH_SHORT).show();
                }else {
                    favourite.fav_list.add(allContent.get(position));
                    Toast.makeText(getActivity(), "added to favourite list", Toast.LENGTH_SHORT).show();
                    SharedPreferences sharedPreferences = Objects.requireNonNull(getActivity()).getSharedPreferences("com.example.project12", Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    Gson gson = new Gson();
                    String json = gson.toJson(favourite.fav_list);
                    editor.putString("favourite_list", json);
                    editor.apply();
                }
            }
        });
    }

}

Избранные действия


import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Objects;

public class favourite extends Fragment {

    private RecyclerView mRecyclerView;
    private content_adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    static ArrayList<content_item> fav_list ;

    private View v ;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        v = inflater.inflate(R.layout.layout_favourite,container,false);

        loadData();

        buildRecycler();
        return v;
    }
    private void loadData(){

        SharedPreferences sharedPreferences = Objects.requireNonNull(getActivity()).getSharedPreferences("com.example.project12",Context.MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("favourite_list",null);
        Type type = new TypeToken<ArrayList<content_item>>(){}.getType();
        fav_list = gson.fromJson(json,type);
    }

    private void buildRecycler(){
        LinkedHashSet<content_item> hFav_list =  new LinkedHashSet<>(fav_list);
        fav_list.clear();
        fav_list.addAll(hFav_list);
        mRecyclerView = v.findViewById(R.id.recyclerview);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(getActivity());
        mAdapter = new content_adapter(fav_list);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);

        mAdapter.setOnItemClickedListener(new content_adapter.OnItemClickedListener() {
            @Override
            public void onItemClick(int position) {
                Intent intent = new Intent(getContext(), Reading.class);
                intent.putExtra("story 1", fav_list.get(position).getmStory());
                startActivity(intent);
            }

            @Override
            public void onItemFavClick(final int position) {
                new AlertDialog.Builder(getActivity())
                        .setIcon(android.R.drawable.ic_dialog_alert)
                        .setTitle("Are you sure?")
                        .setMessage("do you want to remove this from favourite list ?")
                        .setPositiveButton("yes" ,new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(getActivity(),"Removed from favourite list",Toast.LENGTH_SHORT).show();
                        SharedPreferences sharedPreferences = Objects.requireNonNull(getActivity()).getSharedPreferences("com.example.project12",Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = sharedPreferences.edit();
                        fav_list.remove(position);
                        mAdapter.notifyDataSetChanged();
                        Gson gson = new Gson();
                        String json = gson.toJson(fav_list);
                        editor.putString("favourite_list",json);
                        editor.apply();
                    }
                })
                        .setNegativeButton("No",null)
                        .show();


            }

        });


        }
    }

Я хочу сделать список избранных в приложении, но всякий раз, когда я прихожу из другого фрагмента и щелкаю элемент, который уже находится в списке избранных, добавляется снова. Я нашел это о сохраненном экземпляре, как использовать это здесь. всякий раз, когда я изменяю фрагмент, список для избранных изменений

1 Ответ

0 голосов
/ 22 марта 2020

Переопределить equals метод модели и проверить, равен ли уникальный идентификатор в модели.

@Override
public boolean equals(Object obj) {
    if (obj == this) {
        return true;
    }
    if (obj instanceof Model) {
        return id == ((Model) obj).id;
    }
   return false;
  }
...