java - 将 RecyclerView 和 CardAdapter 连接到数据库时出现问题

标签 java android android-recyclerview

所以我的问题出现在库 fragment 中的上下文中。我收到以下错误。

CardAdapter(Android.content.Context, in ArrayList<Card> in CardAdapter cannot be applied to Library ArrayList<Card>

幸运的是,我从 friend 那里得到了一些代码,但我们似乎无法找出其中的差异/错误。

Library.java :

public class Library extends Fragment {

    // Private variables
    private RecyclerView recyclerView;
    private CardAdapter cardAdapter;
    private ArrayList<Card> cardArrayList;
    private ArrayList<Card> tempList;

    public Library() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate view
        View view = inflater.inflate(R.layout.library, container, false);

        // Find recyclerView
        recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);

        // Initialize cardArrayList
        cardArrayList = new ArrayList<>();

        // Initialize cardAdapter
        cardAdapter = new CardAdapter(this.getContext(), cardArrayList);

        // Initialize recyclerView
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this.getContext(), 1);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(cardAdapter);

        // Populate cardArrayList with test Cards
        testCards();

        // Return inflated view
        return view;
    }

    public URL createURL(String constraint) {
        try {
            StringBuilder urlString = new StringBuilder();
            //System.out.print(constraint);
            if (constraint.length() > 0) {
                urlString.append("https://camerondewey.000webhostapp.com/android_podcast_connect.php");
                urlString.append(constraint);
                System.out.print(urlString.toString());
            }
            String muhURL = urlString.toString();
            //System.out.print(muhURL);
            URL myURL = new URL(muhURL);
            System.out.print(myURL);
            return myURL;
            //return new URL(muhURL);
        } catch (Exception e) {
            System.out.print("Failed to return url");
        }
        return null;
    }

    public class GetCardTask extends AsyncTask<URL, Void, JSONArray> {

        @Override
        protected JSONArray doInBackground(URL... params) {
            //System.out.print("Params: " + params[0]);
            HttpURLConnection connection = null;
            StringBuilder result = new StringBuilder();
            try {
                connection = (HttpURLConnection) params[0].openConnection();
                //System.out.println(connection.getResponseCode());
                if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(connection.getInputStream()));
                    String line;
                    while ((line = reader.readLine()) != null) {
                        result.append(line);
                    }
                    try {
                        //System.out.print("SUCCESS");
                        return new JSONArray(result.toString());
                    } catch (JSONException je) {
                        //System.out.print("FAILURE2");
                        JSONArray jArray = new JSONArray();
                        jArray.put(new JSONObject(result.toString()));
                        return jArray;
                    }
                } else {
                    throw new Exception();
                }
            } catch (Exception e) {
                System.out.print("FAILURE1");
                e.printStackTrace();
            } finally {
                connection.disconnect();
            }
            return null;
        }

        @Override
        protected void onPostExecute(JSONArray article) {
            if (article != null) {
                convertJSONtoArrayList(article);
                Library.this.updateDisplay();
            } else {
                System.out.print("failure to execute json conversion");
            }
        }
    }

    private void convertJSONtoArrayList(JSONArray articles) {
        cardArrayList = new ArrayList<Card>(); // clear old player data
        tempList = new ArrayList<Card>();
        try {
            for (int i = 0; i < articles.length(); i++) {
                JSONObject currentArticle = articles.getJSONObject(i);
                cardArrayList.add(new Card(
                        currentArticle.has("name") ? currentArticle.getString("name") : "No Headline",
                        currentArticle.has("description") ? currentArticle.getString("description") : "No Name"
                        ));
                tempList.add(new Card(
                        currentArticle.has("name") ? currentArticle.getString("name") : "No Headline",
                        currentArticle.has("description") ? currentArticle.getString("description") : "No Name"
                ));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private void updateDisplay() {
        if (cardArrayList == null) {
            System.out.print("Display failed to update");
        }
        ArrayList<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
        for (Card item : cardArrayList) {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("name", item.getCardName());
            map.put("description", item.getDescription());
            data.add(map);
        }

        int resource = R.layout.card;
        String[] from = {"name", "description"};
        int[] to = {R.id.card_name, R.id.podcast_desc};
//The error happens here.
        CardAdapter cardAdapter = new CardAdapter(this, cardArrayList);
        recyclerView.setAdapter(cardAdapter);

        cardAdapter.notifyDataSetChanged();
    }

CardAdapter.java

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.CardViewHolder> implements Filterable {

    // Private variables
    private Context cardContext;
    ArrayList<Card> cardList, filteredList;

    public class CardViewHolder extends RecyclerView.ViewHolder{
        public View view;
        public TextView cardName;
        public Card currentItem;

        public CardViewHolder(View v) {
            // Invoke super on view
            super(v);
            view = v;
            this.cardName = (TextView) v.findViewById(R.id.card_name);
            v.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    Intent i = new Intent(v.getContext(),PodcastPage.class);
                    //item clicked
                    v.getContext().startActivity(i);
                }
            });
            // Find cardText
            cardName = (TextView) view.findViewById(R.id.card_name);
        }
    }

    public CardAdapter(Context c, ArrayList<Card> l) {
        this.cardContext = c;
        this.cardList = l;
        this.filteredList = l;
    }

    @Override
    public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card, null);
        return new CardViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final CardViewHolder holder, int position) {
        Card card = cardList.get(position);
        holder.currentItem = cardList.get(position);
        holder.cardName.setText(card.getCardName());
    }

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

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence query) {
                FilterResults results = new FilterResults();
                if (query != null && query.length() > 0) {
                    query = query.toString().toUpperCase();
                    ArrayList<Card> searchResults = new ArrayList<Card>();
                    for (int i = 0; i < filteredList.size(); i++) {
                        if (filteredList.get(i).getCardName().toUpperCase().contains(query)) {
                            searchResults.add(filteredList.get(i));
                        }
                        else if (filteredList.get(i).getDescription().toUpperCase().contains(query)) {
                            searchResults.add(filteredList.get(i));
                        }
                    }
                    results.count = searchResults.size();
                    results.values = searchResults;
                }
                else {
                    results.count = filteredList.size();
                    results.values = filteredList;
                }
                return results;
            }

            @Override
            protected void publishResults(CharSequence query, FilterResults results) {
                filteredList = (ArrayList<Card>) results.values;
                notifyDataSetChanged();
                System.out.println(filteredList);
            }
        };
    }
}

最佳答案

在代码中的 CardAdapter cardAdapter = new CardAdapter(this, cardArrayList); this 不是 Context 而是 fragment 。将行更改为:

CardAdapter cardAdapter = new CardAdapter(getActivity(), cardArrayList);

关于java - 将 RecyclerView 和 CardAdapter 连接到数据库时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48725019/

相关文章:

java - JOOQ基于现有类创建表?

java - 缩放 JFrame 内容

java - Spring MVC : Doesn't deserialize JSON request body

java - 安卓、YUI、Moodle

java - 如何使用 Appium Java 客户端查找 iOS 元素?

Android添加到Layout后修改ImageView参数

android - 无法解析符号 'Twitter' - Twitter Fabric

java - Android - 将 RecyclerView 与默认适配器一起使用

添加新项目时,Android Firebase 聊天 RecyclerView 自动滚动到底部

android - 如何选择性地设置 itemTouchHelper 滑动?