简体   繁体   English

如何将RecyclerView与数据库一起使用?

[英]How can I use a RecyclerView with a database?

I have a ListView where I displayed data from a database using mysql and json but by doing some research I found the RecyclerView widget is a more advanced and flexible version of ListView . 我有一个ListView ,使用mysql和json在其中显示来自数据库的数据,但是通过做一些研究,我发现RecyclerView小部件是ListView的更高级和灵活的版本。 This widget is a container for displaying large data sets and that with the RecyclerView I can have a result like this. 这个小部件是一个用于显示大型数据集的容器,使用RecyclerView可以得到这样的结果。 So how I can correct my code? 那么,如何纠正我的代码? How can I extract an image from a database and fetch it into the RecyclerView 如何从数据库提取图像并将其提取到RecyclerView

在此处输入图片说明

Here's how I've done it in ListView 这是我在ListView

private void showarticles(String json){
        JSONObject jsonObject = null;
        ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String, String>>();
        try {
            JSONArray result = new JSONArray(json);

            for(int i = 0; i<result.length(); i++){
                JSONObject jo = result.getJSONObject(i);
                String name = jo.getString("Nom");
                String ref = jo.getString("Description");
                HashMap<String,String> articles= new HashMap<>();
                articles.put("name",name);
                articles.put("ref",ref);
                list.add(articles);
            }

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

        adapter = new SimpleAdapter(
                getActivity(), list, R.layout.list_row2,
                new String[]{"name","ref"},
                new int[]{R.id.name, R.id.description});

        listView.setAdapter(adapter);
    }
    private void getJSON() {
        class GetJSON extends AsyncTask<Void, Void, String> {
            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(getActivity(), "Téléchargement", "Veuillez patientez...", false, false);
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                JSON_STRING = s;
                showarticles(s);
            }
            @Override
            protected String doInBackground(Void... params) {
                RequestHandler rh = new RequestHandler();
                String s = rh.sendGetRequest(URL);
                return s;
            }
        }
        GetJSON gj = new GetJSON();
        gj.execute();
    }

Update 更新资料

public class recyclerFragment extends Fragment {
private RecyclerView mRecyclerView;
ListAdapter adapter;
private String JSON_STRING;
public static final String URL = "http://aaaa.com/Back/getArticles.php";
private MyAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootview = inflater.inflate(R.layout.recycler_fragment, container, false);
    mRecyclerView = (RecyclerView) rootview.findViewById(R.id.my_list);
    mRecyclerView.addItemDecoration(new SpacesItemDecoration(10));
    mLayoutManager = new GridLayoutManager(getActivity(), 2);
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new MyAdapter(null);
    mRecyclerView.setAdapter(mAdapter);
    getJSON();
return rootview;
}
private void showarticles(String json){
        JSONObject jsonObject = null;
        ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String, String>>();
        try {
            JSONArray result = new JSONArray(json);

            for(int i = 0; i<result.length(); i++){
                JSONObject jo = result.getJSONObject(i);
                String name = jo.getString("Nom");
                String ref = jo.getString("Description");
                HashMap<String,String> articles= new HashMap<>();
                articles.put("name",name);
                articles.put("ref",ref);
                list.add(articles);
            }

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

    mAdapter = new SimpleAdapter(
            getActivity(), list, R.layout.list_row2,
            new String[]{"name","ref"},
            new int[]{R.id.nom, R.id.email2});

    mRecyclerView.setAdapter(mAdapter);
}
private void getJSON() {
    class GetJSON extends AsyncTask<Void, Void, String> {
        ProgressDialog loading;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            loading = ProgressDialog.show(getActivity(), "Téléchargement", "Veuillez patientez...", false, false);
        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            loading.dismiss();
            JSON_STRING = s;
            showEmployee(s);
        }
        @Override
        protected String doInBackground(Void... params) {
            RequestHandler rh = new RequestHandler();
            String s = rh.sendGetRequest(URL);
            return s;
        }
    }
    GetJSON gj = new GetJSON();
    gj.execute();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Intent intent = new Intent(getActivity().getApplicationContext(), ViewProduit.class);
    HashMap<String, String> map = (HashMap) parent.getItemAtPosition(position);
    String tid = map.get("ref").toString();
    intent.putExtra("ref", tid);
    startActivity(intent);
}

} }

Error:(31, 27) error: cannot find symbol variable myArrayList
Error:(76, 13) error: cannot find symbol variable myArrayList
Error:(77, 20) error: cannot find symbol variable myArrayList
Error:(41, 45) error: cannot find symbol class SpacesItemDecoration
Error:(44, 20) error: constructor MyAdapter in class MyAdapter cannot be applied to given types;
required: no arguments
found: <null>
reason: actual and formal argument lists differ in length
Error:(74, 20) error: incompatible types: SimpleAdapter cannot be converted to MyAdapter
Error:(106, 5) error: method does not override or implement a method from a supertype
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

You need to have a RecyclerView in your layout first. 您首先需要在布局中具有RecyclerView

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

Now if you're in an Activity , lets initialize your RecyclerView along with the LayoutManager . 现在,如果您处于“ Activity ,让我们与LayoutManager一起初始化RecyclerView In your case you need to have a GridLayoutManager 在您的情况下,您需要有一个GridLayoutManager

// Declare them first
private RecyclerView mRecyclerView;
private MyAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;

Initialize the items inside your onCreate function and set the Adapter here. 初始化onCreate函数中的项目,然后在此处设置Adapter

mRecyclerView = (RecyclerView) findViewById(R.id.my_list);
mRecyclerView.addItemDecoration(new SpacesItemDecoration(10));
mLayoutManager = new GridLayoutManager(getActivity(), 2);
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new MyAdapter();
mRecyclerView.setAdapter(mAdapter);

Now get your ArrayList prepared to pass it in the Adapter and then call notifyDataSetChanged() to populate the RecyclerView with the items you want to show. 现在,准备好将ArrayList传递给Adapter ,然后调用notifyDataSetChanged() ,用要显示的项目填充RecyclerView

So here you go with your custom Adapter 所以在这里,您可以使用自定义Adapter

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

    public MyAdapter() {
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        // Declare the items in each row 
        private TextView myTextView;

        public ViewHolder(final View itemView) {
            super(itemView);

            // Initialize the items here
            myTextView = (TextView) itemView.findViewById(R.id.my_textview);
        }

        public void bindView(int pos) {
            // Set the items here with specific array elements you have
            String text = myArrayList.get(pos);
            myTextView.setText(text);
        }
    }

    // Now define the viewholder for Normal list item
    public class NormalViewHolder extends ViewHolder {
        public NormalViewHolder(View itemView) {
            super(itemView);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO: Here's what you want to do when your list item is clicked
                }
            });
        }
    }

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

        View v;

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

        NormalViewHolder vh = new NormalViewHolder(v);

        return vh;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        try {
            if (holder instanceof NormalViewHolder) {
                NormalViewHolder vh = (NormalViewHolder) holder;
                vh.bindView(position);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public int getItemCount() {
        if (myArrayList != null)
            return myArrayList.size();
        else return 0;
    }

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

Declare myArrayList as global and populate myArrayList with the elements you want and customize the bindView as you want. myArrayList声明为全局,并用所需的元素填充myArrayList并根据需要自定义bindView When you are done with populating the myArrayList call notifyDatasetChanged() on your Adapter like mAdapter.notifyDataSetChanged() . 完成填充myArrayList调用notifyDatasetChanged() ,请像mAdapter.notifyDataSetChanged()一样在Adapter上调用notifyDatasetChanged() mAdapter.notifyDataSetChanged()

Update 更新资料

So here's I'm taking your updated code and modifying as much as possible. 因此,这里是我获取您的更新代码并进行尽可能多的修改。 The code might have errors, but I think after you get it modified you can do the rest by yourself. 该代码可能有错误,但是我认为在对其进行修改后,您可以自己完成其余的工作。

public class recyclerFragment extends Fragment {
    private RecyclerView mRecyclerView;
    private MyAdapter mAdapter;
    private String JSON_STRING;
    public static final String URL = "http://aaaa.com/Back/getArticles.php";
    private RecyclerView.LayoutManager mLayoutManager;

    // Declare the list globally
    ArrayList<HashMap<String,String>> list;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootview = inflater.inflate(R.layout.recycler_fragment, container, false);
        mRecyclerView = (RecyclerView) rootview.findViewById(R.id.my_list);

        // Initialize the list here 
        list = new ArrayList<HashMap<String, String>>();

        // Initialize other items
        mRecyclerView.addItemDecoration(new SpacesItemDecoration(10));
        mLayoutManager = new GridLayoutManager(getActivity(), 2);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mAdapter = new MyAdapter();
        mRecyclerView.setAdapter(mAdapter);
        getJSON();

        return rootview;
    }

    private void showarticles(String json){
            JSONObject jsonObject = null;

            try {
                JSONArray result = new JSONArray(json);

                for(int i = 0; i<result.length(); i++){
                    JSONObject jo = result.getJSONObject(i);
                    String name = jo.getString("Nom");
                    String ref = jo.getString("Description");
                    HashMap<String,String> articles= new HashMap<>();
                    articles.put("name",name);
                    articles.put("ref",ref);
                    list.add(articles);
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
        // Here you can call notifyDataSetChanged in your Adapter. As you've the dataset ready now. 
        mAdapter.notifyDataSetChanged();
    }

    private void getJSON() {
        class GetJSON extends AsyncTask<Void, Void, String> {
            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(getActivity(), "Téléchargement", "Veuillez patientez...", false, false);
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                JSON_STRING = s;
                showEmployee(s);
            }
            @Override
            protected String doInBackground(Void... params) {
                RequestHandler rh = new RequestHandler();
                String s = rh.sendGetRequest(URL);
                return s;
            }
        }
        GetJSON gj = new GetJSON();
        gj.execute();
    }

    // Here you write your custom Adapter class 
    public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

        public MyAdapter() {
        }

        public class ViewHolder extends RecyclerView.ViewHolder {

            // Declare the items in each row 
            private Button myButton;

            public ViewHolder(final View itemView) {
                super(itemView);

                // Initialize the items here
                myButton = (TextView) itemView.findViewById(R.id.my_button);
            }

            public void bindView(int pos) {
                // Set the items here with specific array elements you have

                myButton.setOnClickListener(new View.OnClickListener()     {
                    @Override
                    public void onClick(View v) {
                        // Here's what you want to do when your list item is clicked
                        Intent intent = new Intent(getActivity().getApplicationContext(), ViewProduit.class);
                        HashMap<String, String> map = (HashMap) parent.getItemAtPosition(pos);
                        String tid = map.get("ref").toString();
                        intent.putExtra("ref", tid);
                        startActivity(intent);

                    }
                });
            }
        }

        // Now define the viewholder for Normal list item
        public class NormalViewHolder extends ViewHolder {
            public NormalViewHolder(View itemView) {
                super(itemView);
            }
        }

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

            View v;

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

            NormalViewHolder vh = new NormalViewHolder(v);

            return vh;
        }

        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            try {
                if (holder instanceof NormalViewHolder) {
                    NormalViewHolder vh = (NormalViewHolder) holder;
                    vh.bindView(position);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public int getItemCount() {
            if (list != null)
                return list.size();
            else return 0;
        }

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用领域数据库为recyclerView存储字符串? - How can I use realm database to store strings for recyclerView? 如何在RecyclerView中使用LoadMore? - How can I use LoadMore in RecyclerView? 我如何在片段中使用 RecyclerView - How i can use RecyclerView inside a fragment 如何使用 AsyncTask、RecyclerView 和 RecyclerView.Adapter 将手机中的图像获取到 RecyclerView? - How can I use AsyncTask, RecyclerView, and a RecyclerView.Adapter to get images from my phone into my RecyclerView? 如何每秒使用 RecyclerView 刷新 Firebase 数据库数据 - How can I refresh Firebase database data with RecyclerView every seconde 我如何从多个数据库引用中获取相同的recyclerview - How can i fetch the same recyclerview from multiple database references 如何从 RecyclerView(Firebase 数据库)中删除当前位置 - How can i delete the Current position from RecyclerView (Firebase Database) 如何将SortedList与RecyclerView一起使用以对不同的参数进行排序? - How can I use a SortedList with a RecyclerView to sort different parameters? 如何在ViewHolder中为RecyclerView使用ColorStateList? - How can I use a ColorStateList within a ViewHolder for a RecyclerView? 如何使用 RecyclerView 打开 ViewPager 中的特定页面? - How can I use the RecyclerView to open specific pages in ViewPager?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM