Android - 逐项添加项目到RecyclerView?

时间:2016-08-08 05:01:18

标签: android android-recyclerview android-volley android-adapter

我需要将我的项目逐个添加到RcyclerView,例如将第一项添加到recyclerView显示,然后添加另一项....

我有一个连接到服务的凌空,然后给我一些数据,在这个凌空中我称之为方法:

private void makeJsonArryReq(String uri) {
    userPointList = new ArrayList<>();
    orginal = new ArrayList<>();

    final JsonArrayRequest req = new JsonArrayRequest(uri,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {

                    orginal = MarketingPoints_JSONParser.FeedOriginal(response.toString(), mUser_Code, ReportActivity.this);
                    userPointList = MarketingPoints_JSONParser.parseFeed(response.toString(), mUser_Code, ReportActivity.this);
                    FillList();
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d("Custom Log Error", "Error: " + error.getMessage());
        }
    });
    AppController.getInstance().addToRequestQueue(req, tag_json_arry);
}

当我调用此方法FillList();时,它会填充并显示RecyclerView上的第一个项目,如何收听适配器以进行最终确定,并再次为下一个项目调用FillList();

我的FillList()

public void FillList() {
        Geocoder geocoder = new Geocoder(activity, Locale.getDefault());
            List<Address> addresses;
            StepModel stp = null;
            List<StepModel> Step = new ArrayList<>();
            if (check < userPointList.size()) {
                try {
                    addresses = geocoder.getFromLocation(userPointList.get(check).getLat(), userPointList.get(check).getLng(), 1);
                    stp = new StepModel();
                    stp.setsCity(addresses.get(0).getAdminArea());
                    stp.setsStreet(addresses.get(0).getThoroughfare());
                    stp.setSlat(userPointList.get(check).getLat());
                    stp.setSlng(userPointList.get(check).getLng());
                    stp.setSdate(userPointList.get(check).getDate());
                    stp.setStime(userPointList.get(check).getTime());
                    stp.setsCounts(userPointList.get(check).getCounts());
                    stp.setSprofilePhoto(userPointList.get(check).getProfilePhoto());
                    stp.setsUserCode(userPointList.get(check).getUserCode());
                    Step.add(stp);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                pointAdapter = new PointsList_Adapter(Step, ReportActivity.this,this, city, street);
                Points_Recycler.setAdapter(pointAdapter);
                pointAdapter.notifyDataSetChanged();
                check++;
            }else {
                return;
            }
    }

解释:

我连接到服务然后收到json然后我将其转换并存储在List。在我的json我有两个特定数据(Latlng)我应该获得名称country和name street(例如100 lat lng),然后在recyclerView上显示但是它会花很长时间,因为我应该填充recyclerView一个。

我的适配器:

public class PointsList_Adapter extends RecyclerView.Adapter<PointsList_Adapter.ViewHolder> {
    int count = 0;
    private List<StepModel> mpList;
    public static Activity activity;
    public static boolean flagItem = true;
    public static boolean flagToast = true;

    private mstep Mstep;
    public PointsList_Adapter(List<StepModel> userCodeList, Activity activity) {
        this.mpList = userCodeList;
        this.activity = activity;

    }

    @Override
    public PointsList_Adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // create a new view
        View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.listpoints_cardview, null);

        // create ViewHolder
        ViewHolder viewHolder = new ViewHolder(itemLayoutView);
        return viewHolder;
    }
    @Override
    public void onBindViewHolder(PointsList_Adapter.ViewHolder viewHolder, final int position) {

        String dateValue = mpList.get(position).getDate();
        final String countValue = String.valueOf(mpList.get(position).getCounts());
        final Double lat = mpList.get(position).getLat();
        final Double lng = mpList.get(position).getLng();
        final String userCode = mpList.get(position).getUserCode();
        final String time = mpList.get(position).getTime();
        final int counts = mpList.get(position).getCounts();
        final String city = mpList.get(position).getCity();
        final String street = mpList.get(position).getStreet();

        viewHolder.txtDate.setText(dateValue);
        viewHolder.txtPoints.setText(lat + " , " + lng);
        viewHolder.txtTime.setText(time);
        viewHolder.txtAddress.setText(city + " , " + street);
        viewHolder.txtCount.setText(countValue);
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public TextView txtDate, txtPoints, txtTime, txtAddress, txtCount;
        public LinearLayout lLstPoints;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            txtDate = (TextView) itemLayoutView.findViewById(R.id.txtDate);
            txtPoints = (TextView) itemLayoutView.findViewById(R.id.txtPoints);
            txtTime = (TextView) itemLayoutView.findViewById(R.id.txtTime);
            txtAddress = (TextView) itemLayoutView.findViewById(R.id.txtAddress);
            txtCount = (TextView) itemLayoutView.findViewById(R.id.txtCount);
            lLstPoints = (LinearLayout) itemLayoutView.findViewById(R.id.lLstPoints);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

在从服务器一次检索所有数据之后,在Filllist()方法中,您应该使用for,while或do..while循环来迭代您的代码。您已经使用了if条件循环,它只运行一次。

否则,您可以在适配器中创建一个方法,将项目添加到列表中,然后在那里调用notifydatasetchanged()方法。

List<string> list = new List<string>(){"Oracle","SQL Server","Java","Oracle","Python"};

答案 1 :(得分:0)

请在adapter中添加以下方法:

  public reloadList(ArrayList<String> mpList) {
    this.mpList.addAll(mpList);
}

如果您想要更新列表或想在listview中添加一个项目,请使用以下代码:

 public void FillList() {
        Geocoder geocoder = new Geocoder(activity, Locale.getDefault());
        List<Address> addresses;
        StepModel stp = null;
        List<StepModel> Step = new ArrayList<>();
        if (check < userPointList.size()) {
            try {
                addresses = geocoder.getFromLocation(userPointList.get(check).getLat(), userPointList.get(check).getLng(), 1);
                stp = new StepModel();
                stp.setsCity(addresses.get(0).getAdminArea());
                stp.setsStreet(addresses.get(0).getThoroughfare());
                stp.setSlat(userPointList.get(check).getLat());
                stp.setSlng(userPointList.get(check).getLng());
                stp.setSdate(userPointList.get(check).getDate());
                stp.setStime(userPointList.get(check).getTime());
                stp.setsCounts(userPointList.get(check).getCounts());
                stp.setSprofilePhoto(userPointList.get(check).getProfilePhoto());
                stp.setsUserCode(userPointList.get(check).getUserCode());
                Step.add(stp);
            } catch (IOException e) {
                e.printStackTrace();
            }

            // Just update your list and call notifyDataSetChanged()
            pointAdapter .reloadList(Step);
            pointAdapter .notifyDataSetChanged();
            check++;
        }else {
            return;
        }
    }

按如下方式初始化您的适配器:

ArrayList<StepModel> userCodeList = new ArrayList<StepModel>();
pointAdapter = new PointsList_Adapter(userCodeList , activity) ;

谢谢。