【问题标题】:how to sort the data in RecyclerViewRecyclerView如何对数据进行排序
【发布时间】:2015-12-10 07:05:54
【问题描述】:

我可能看起来很重复,但我真的找不到更好的方法来对包含 cardview 的回收器视图中的数据进行排序。

下面是我mainactivity中recyclerview的sn-p

 mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    mRecyclerView.setLayoutManager(linearLayoutManager);


    mAdapter = new PickUpPointAdapter(testData);
    mRecyclerView.setAdapter(mAdapter);
    mCardView=(CardView)findViewById(R.id.searchcard);


    mCardView.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View v) {
            // item clicked
            Intent search = new Intent( AppController.getAppContext(), TabLayoutActivity.class);
            search.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(search);
        }
    });

    Map<String,String> params = new HashMap<String,String>();
    JsonObjectRequest NearbyPickUpPointReq = new JsonObjectRequest (Request.Method.GET,url_searchNearBybusStopServlet,new JSONObject(params), new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.d("Tag", response.toString());
            // hidePDialog();
            try {
                JSONArray obj1 = response.getJSONArray("pickuppoint");
                testData.clear();
                // Parsing json
                for (int i = 0; i < obj1.length(); i++) {


                    JSONObject obj = (JSONObject)obj1.get(i);
                    SearchResults srchresult = new SearchResults();
                    srchresult.setPickUpPoint(obj.getString("PickupPoint"));
                    srchresult.setRouteName(obj.getString("RouteName"));
                    srchresult.setLatitude(obj.getDouble("Latitude"));
                    srchresult.setLongitude(obj.getDouble("Longitude"));
                    srchresult.setWalkingTime(obj.getInt("WalkingTime"));
                    srchresult.setRoute2("-");
                    mapMarker( srchresult.getLatitude(), srchresult.getLongitude(),srchresult.getPickUpPoint());
                    String[] RouteArray = srchresult.getRouteName().split(",");
                    //  Log.e(TAG, "Error: " + RouteArray.length);
                    srchresult.setRoute1( RouteArray[0]);
                    if(RouteArray.length>1)
                        srchresult.setRoute2(RouteArray[1]);
                    testData.add(srchresult);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            // notifying list adapter about data changes
            // so that it renders the list view with updated data


            mAdapter.notifyDataSetChanged();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //   VolleyLog.d(TAG, "Error: " + error.getMessage());
            // hidePDialog();

        }

    });

    // Adding request to request queue

    AppController.getInstance().addToRequestQueue(NearbyPickUpPointReq);


    }

这是自定义适配器

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

ArrayList<SearchResults> mItems;
public int TAG=0;


public PickUpPointAdapter(ArrayList<SearchResults> mItems) {
    this.mItems=mItems;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.nearby_busstop_list_layout, viewGroup, false);
    ViewHolder viewHolder = new ViewHolder(v);
    return viewHolder;
}

@Override
public void onBindViewHolder(final ViewHolder viewHolder, int i) {
    final SearchResults routename = mItems.get(i);
    viewHolder.tv_pickuppointname.setText(routename.getPickUpPoint());
    viewHolder.tv_walkingtime.setText(String.valueOf(routename.getWalkingTime())+"min walk ");
    viewHolder.tv_allroutename.setText(routename.getRouteName());
    viewHolder.tv_route1.setText(routename.getRoute1());
    viewHolder.tv_route2.setText(routename.getRoute2());

    Log.e("TAG","i value="+ i);
   // if(i==mItems.size()-1)
      // viewHolder.seperator.setVisibility(View.INVISIBLE);
       viewHolder.mView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Context context = v.getContext();
            Intent intent = new Intent(context,BusStopDetailsnew.class);
            intent.putExtra("pickup", routename.getPickUpPoint());
            intent.putExtra("route", routename.getRouteName());
            intent.putExtra("walk", routename.getWalkingTime());
            intent.putExtra("lat", routename.getLatitude());
            intent.putExtra("lon", routename.getLongitude());
            context.startActivity(intent);
        }
    });

}

@Override
public int getItemCount() {
    Log.e("TAG","item size"+ mItems.size());
    return mItems.size();

}

class ViewHolder extends RecyclerView.ViewHolder{


    public TextView tv_pickuppointname;
    TextView tv_walkingtime;
    TextView tv_allroutename;
    TextView tv_route1;
    TextView tv_route2;
    public View seperator;
    public View mView;

    public ViewHolder(View itemView) {
        super(itemView);
        mView=itemView;
        tv_pickuppointname = (TextView)itemView.findViewById(R.id.BusstopName);
        tv_walkingtime = (TextView) itemView.findViewById(R.id.walktime);
        tv_allroutename = (TextView) itemView.findViewById(R.id.allbusRoute);
        tv_route1 = (TextView) itemView.findViewById(R.id.RouteName1);
        tv_route2 = (TextView) itemView.findViewById(R.id.RouteName2);
        seperator=(View)itemView.findViewById(R.id.seperator);
    }
    }

最后是 getter 和 setters 方法

public class SearchResults {
private String PickUpPoint="";
private int WalkingTime=0;
private String RouteName = "";
private String Route1="";
private String Route2="";
private Double Latitude = null;
private Double Longitude = null;




//walking time
public int getWalkingTime() {
    return WalkingTime;
}

public void setWalkingTime(int WalkingTime) {
    this.WalkingTime = WalkingTime;
}

//Route1
public String getRoute1() {
    return Route1;
}

public void setRoute1(String Route1) {
    this.Route1 = Route1;
}

//Route2
public String getRoute2() {
    return Route2;
}

public void setRoute2(String Route2) {
    this.Route2 = Route2;
}

//PickUpPoint
public void setPickUpPoint(String PickUpPoint) {
    this.PickUpPoint = PickUpPoint;
}

public String getPickUpPoint() {
    return PickUpPoint;
}
//RouteName ArrayList
public void setRouteName(String RouteName) {
    this.RouteName = RouteName;
}

public String getRouteName() {
    return RouteName;
}
//Latitude
public void setLatitude(Double Latitude) {
    this.Latitude = Latitude;
}

public Double getLatitude() {
    return Latitude;
}
//Longitude
public void setLongitude(Double Longitude) {
    this.Longitude = Longitude;
}

public Double getLongitude() {
    return Longitude;
}
}

我想根据步行时间对列表进行排序。谁能帮我这个?

【问题讨论】:

  • 正如无数类似问题中所述...您必须对底层数据进行排序...
  • @Selvin“排序底层数据”是一个抽象术语:你必须链接到示例代码,否则你的评论是没有结果的
  • @pskink 不要模拟 OP ...您的评论暗示 OP 无法进行简单的谷歌搜索。
  • 投反对票有什么必要?当我已经提到我无法得到正确的答案时?

标签: android sorting android-recyclerview custom-adapter


【解决方案1】:

//你可以在bean中使用可比较的接口并与特定字段进行比较

public class SearchResults implements Comparable{

    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public int compareTo(Object another) {
        if(((SearchDetail)another).getId() > id){
            return 1;
        }if(((SearchDetail)another).getId() == id){
            return 0;
        }else{
            return -1;
        }
        return 0;
    }
}

请比较您要比较的字段

已编辑-

mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(linearLayoutManager);


mAdapter = new PickUpPointAdapter(testData);
mRecyclerView.setAdapter(mAdapter);
mCardView=(CardView)findViewById(R.id.searchcard);


mCardView.setOnClickListener(new View.OnClickListener() {
    @Override public void onClick(View v) {
        // item clicked
        Intent search = new Intent( AppController.getAppContext(), TabLayoutActivity.class);
        search.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(search);
    }
});

Map<String,String> params = new HashMap<String,String>();
JsonObjectRequest NearbyPickUpPointReq = new JsonObjectRequest (Request.Method.GET,url_searchNearBybusStopServlet,new JSONObject(params), new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        Log.d("Tag", response.toString());
        // hidePDialog();
        try {
            JSONArray obj1 = response.getJSONArray("pickuppoint");
            testData.clear();
            // Parsing json
            for (int i = 0; i < obj1.length(); i++) {


                JSONObject obj = (JSONObject)obj1.get(i);
                SearchResults srchresult = new SearchResults();
                srchresult.setPickUpPoint(obj.getString("PickupPoint"));
                srchresult.setRouteName(obj.getString("RouteName"));
                srchresult.setLatitude(obj.getDouble("Latitude"));
                srchresult.setLongitude(obj.getDouble("Longitude"));
                srchresult.setWalkingTime(obj.getInt("WalkingTime"));
                srchresult.setRoute2("-");
                mapMarker( srchresult.getLatitude(), srchresult.getLongitude(),srchresult.getPickUpPoint());
                String[] RouteArray = srchresult.getRouteName().split(",");
                //  Log.e(TAG, "Error: " + RouteArray.length);
                srchresult.setRoute1( RouteArray[0]);
                if(RouteArray.length>1)
                    srchresult.setRoute2(RouteArray[1]);
                testData.add(srchresult);
            }
        Collections.sort(testData);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        // notifying list adapter about data changes
        // so that it renders the list view with updated data


        mAdapter.notifyDataSetChanged();
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        //   VolleyLog.d(TAG, "Error: " + error.getMessage());
        // hidePDialog();

    }

});

// Adding request to request queue

AppController.getInstance().addToRequestQueue(NearbyPickUpPointReq);


}

【讨论】:

  • 请告诉我我想在哪里使用这个方法以及在设置数据期间我应该如何调用它
  • 当所有数据都添加到列表中时,您需要调用 Collections.sort(list)。在比较方法中,您必须比较要排序的任何字段上的对象
  • 非常感谢,但我仍然不知道在哪里调用它。你能检查一下代码并告诉我我应该在哪里打电话吗?我是 Android 新手
  • 在 onResponse 方法中竞争循环后,如果您对我的回答感到满意,请点赞并接受它
  • 它不起作用。你可以在这里发布确切的代码吗?或任何示例代码?
【解决方案2】:

您可以实现更高效的 SortedList。 SortedList 在支持库 V7 (android.support.v7.util) 中可用。根据文档:

它使用 SortedList.Callback.compare(Object, Object) 方法并使用二分搜索来检索项目。

它更高效,并且可以更好地控制排序列表中的添加、插入和删除。您所要做的就是将我们的列表切换到适配器中的 SortedList 并覆盖 3 个适配器回调方法:compare()、areContentsSame() 和 areItemsSame()。你可以找到更多关于它的使用细节here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多