【问题标题】:Save item from RecyclerView to Favorites将项目从 RecyclerView 保存到收藏夹
【发布时间】:2020-10-17 23:33:38
【问题描述】:

我正在制作一个应用程序,它从 recyclerview 中的 json url 获取图像、文本、url 并在 cardview 中显示文本和图像。当用户单击该项目时,它将打开新的 webview 活动并将 URL 传递给该活动。一切正常。但现在我想制作一个收藏列表,当用户单击 recyclerview 项目上的按钮时,它会将此项保存到收藏列表中。并且用户也可以单击此项目并按原样打开 webview 活动。我在互联网上搜索了很多,我发现我需要为此使用 SQLite,但我找不到任何好的教程或任何示例。

我已经为适配器中的按钮创建了 setOnClickListener 方法,但不知道下一步该做什么

有什么想法吗?对不起我的英语。

这是我的代码

HomeFragment.java

public class HomeFragment extends Fragment {
    private final String Data = "https://medicalibrary.net/wp-content/uploads/AaaLatestUpdatet.json";
    private RecyclerView recyclerView;
    private JsonArrayRequest jsonArrayRequest;
    RequestQueue requestQueue;
    private ArrayList<Model> modelList = new ArrayList<>();
    private RecyclerAdapter recyclerAdapter;



    public static HomeFragment newInstans() {
        HomeFragment homeFragment = new HomeFragment();
        return homeFragment;
    }


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.home_fragment_acivity, container, false);

        recyclerView = view.findViewById(R.id.recyclerview2);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setHasFixedSize(true);

        
        httpGet();


        return view;
    }

    private void httpGet() {
        requestQueue = Volley.newRequestQueue(getContext());
        jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, Data, null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                for (int i = 0; i < response.length(); i++) {
                    try {
                        JSONObject jsonObject = response.getJSONObject(i);
                        Model model = new Model();
                        model.setTitle(jsonObject.getString("title"));
                        model.setImage(jsonObject.getString("image"));
                        model.setUrl(jsonObject.getString("url"));

                        modelList.add(model);



                        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
                        recyclerAdapter = new RecyclerAdapter(getContext(), modelList);
                        recyclerView.setAdapter(recyclerAdapter);


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

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("Tag", "onErrorResponse" + error.getMessage());
            }
        });

        requestQueue.add(jsonArrayRequest);
    }
}

模型.java

public class Model {
    String title, image, url;

    public Model() {
    }



    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getTitle() {
        return title;
    }

    public String getImage() {
        return image;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setImage(String image) {
        this.image = image;
    }


}

RecyclerAdapter.java

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
    private Context mContext;
    private List<Model> modelList;


    public RecyclerAdapter(Context context, List<Model> listData) {
        this.modelList = listData;
        this.mContext = context;

    }

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

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false);
        return new ViewHolder(view);
    }



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

        holder.title.setText(modelList.get(position).getTitle());
        Picasso.get().load(modelList.get(position).getImage()).into(holder.imageView);

    }



    @Override
    public int getItemCount() {
        return modelList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView title;
        ImageView imageView;
        Button favBtn;

        public ViewHolder(View itemView) {
            super(itemView);
            itemView.setClickable(true);
            mContext = itemView.getContext();

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String Url = modelList.get(getAdapterPosition()).getUrl();
                    Intent i = new Intent(mContext, WebViewActivity.class);
                    i.putExtra("url1", modelList.get(getAdapterPosition()).getUrl());

                    ///  i.putExtra("url", Url);
                    mContext.startActivity(i);
                }
            });

            title = itemView.findViewById(R.id.Title);
            imageView = itemView.findViewById(R.id.ImageView);
            favBtn = itemView.findViewById(R.id.favBtn);
            favBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    Model model = modelList.get(position);


                }
            });
        }
    }
}

WebViewActivity.java

public class WebViewActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);



        WebView webView = findViewById(R.id.mWebView);
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        Intent i = getIntent();
        String url = i.getStringExtra("url1");
        webView.loadUrl(url);


    }
}

【问题讨论】:

    标签: android android-studio android-recyclerview


    【解决方案1】:

    我的建议是查看Android Room Persistence Library 以保存您的收藏夹列表。 SharedPreferences 是另一种选择。

    从架构的角度来看,查看存储库模式对您会有所帮助,您可以找到 here

    考虑到这一点,首先,我将向您的适配器传递一个侦听器:

    public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
    
        interface ItemClickListener {
            void onItemClicked(model: Model)
        }
    
        private Context mContext;
        private List<Model> modelList;
        private ItemClickListener itemClickListener;
    
        public RecyclerAdapter(
            Context context, 
            List<Model> listData, 
            ItemClickListener itemClickListener
        ) {
            this.modelList = listData;
            this.mContext = context;
            this.itemClickListener = itemClickListener;
        }
    
        ...
    
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                itemClickListener.onItemClicked()
            }
        });
    }
    

    然后在HomeFragment中实现监听器:

    class HomeFragment extends Fragment implements RecyclerAdapter.ItemClickListener {
    
        ...
    
        @Override
        public void onItemClicked(Model model) {
            viewModel.saveFavorite(model);            
            router.openWebView(model.getUrl());
        }
    
        ...
    
    }
    

    【讨论】:

      【解决方案2】:

      您应该创建一个点击监听接口,包括收藏和点击操作,并将点击事件传递给活动或片段。

      您可以使用 SharedPreferences、Room、Realm 等来保存您的收藏夹。这是一个关于这个的教程:https://medium.com/android-gate/recyclerview-item-click-listener-the-right-way-daecc838fbb9

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 2016-03-20
        相关资源
        最近更新 更多