Android 分组ListView 案例
关于分组ListView的示例,如下效果:
按年月进行分组排序。
1、Activity:
package com.gshop.mine.mypoints; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.ListView; import com.gbi.adapter.WealthAdapter; import com.gbi.bean.WealthBean; import com.gbi.customview.Title; import com.gbi.utils.DateUtils; import com.gbi.yfshop.BaseActivity; import com.gbi.yfshop.R; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; public class WealthActivity extends BaseActivity implements View.OnClickListener { private ListView lv_wealth; private List<WealthBean> datas; private WealthAdapter wealthAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_wealth); initView(); } private void initView(){ datas = new ArrayList<>(); datas.add(new WealthBean(1,"2022-06-10 10:10:22")); datas.add(new WealthBean(2,"2022-06-12 10:10:26")); datas.add(new WealthBean(3,"2022-07-10 10:10:28")); datas.add(new WealthBean(4,"2022-07-12 10:10:30")); datas.add(new WealthBean(5,"2022-08-10 10:10:32")); datas.add(new WealthBean(6,"2022-08-12 10:10:36")); datas.add(new WealthBean(7,"2022-09-10 10:10:38")); datas.add(new WealthBean(8,"2022-09-12 10:10:50")); Collections.sort(datas, new Comparator<WealthBean>(){ @Override public int compare(WealthBean o1, WealthBean o2) { Date d1 = DateUtils.stringToDate(o1.getBuyDate()); Date d2 = DateUtils.stringToDate(o2.getBuyDate()); return d2.compareTo(d1); } }); List tags = getTag(); lv_wealth = findViewById(R.id.lv_wealth); wealthAdapter = new WealthAdapter(this,datas,tags); wealthAdapter.setDataList(datas); lv_wealth.setAdapter(wealthAdapter); wealthAdapter.notifyDataSetChanged(); } private List getTag(){ List result = new ArrayList<>(); for (WealthBean w: datas){ if(!result.contains(DateUtils.stringToDateStr(w.getBuyDate()))){ result.add(DateUtils.stringToDateStr(w.getBuyDate())); } } return result; } @Override public void onClick(View v) { } }
2、WealthAdapter:
package com.gbi.adapter; import android.content.Context; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; import androidx.annotation.NonNull; import com.gbi.bean.WealthBean; import com.gbi.utils.DateUtils; import com.gbi.yfshop.R; import java.util.List; public class WealthAdapter extends ArrayAdapter { private Context mContext; private List<WealthBean> mList; private OnClickedListener mListener; private List listTag = null; public WealthAdapter(@NonNull Context context, int resource) { super(context, resource); } public WealthAdapter(Context context, List<WealthBean> list, List tags) { super(context, 0, list); mContext = context; mList = list; this.listTag = tags; } public interface OnClickedListener{ void onCliked(int id); } public void setmListener(OnClickedListener mListener) { this.mListener = mListener; } public void setDataList(List<WealthBean> list){ mList = list; } @Override public boolean isEnabled(int position) { if(position==0){ return true; } String preDate = DateUtils.stringToDateStr(getItem(position - 1).getBuyDate()); String currentDate = DateUtils.stringToDateStr(getItem(position).getBuyDate()); if(preDate.equals(currentDate)){ return false; } return super.isEnabled(position); } @Override public int getCount() { return mList.size(); } @Override public WealthBean getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if(convertView==null) { convertView = View.inflate(mContext, R.layout.item_wealth,null); holder = initView(convertView); }else{ holder = (ViewHolder) convertView.getTag(); } WealthBean bean = mList.get(position); boolean isEnabled = isEnabled(position); String buyDate = DateUtils.stringToDateStr(bean.getBuyDate()); Log.i("test","-----"+buyDate); if(isEnabled){ holder.tv_buyDate.setText(buyDate); holder.tv_buyDate.setVisibility(View.VISIBLE); }else{ holder.tv_buyDate.setVisibility(View.GONE); } holder.tv_detail_buyDate.setText(bean.getBuyDate()); convertView.setTag(holder); return convertView; } private ViewHolder initView(View v){ ViewHolder holder = new ViewHolder(); holder.tv_buyDate = v.findViewById(R.id.tv_buyDate); holder.tv_detail_buyDate = v.findViewById(R.id.tv_detail_buyDate); return holder; } class ViewHolder { TextView tv_buyDate; TextView tv_detail_buyDate; } }
3、WealthBean
package com.gbi.bean; public class WealthBean { private int id; private String buyDate; public WealthBean() { } public WealthBean(int id, String buyDate) { this.id = id; this.buyDate = buyDate; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getBuyDate() { return buyDate; } public void setBuyDate(String buyDate) { this.buyDate = buyDate; } }
4、DateUtils
package com.gbi.utils; import java.text.SimpleDateFormat; import java.util.Date; public class DateUtils { public static String stringToDateStr(String dateString) { String result = ""; try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); Date dateValue = sdf.parse(dateString); result = sdf.format(dateValue); return result; }catch (Exception exception){ exception.getMessage(); } return result; } public static Date stringToDate(String dateString) { Date result = new Date(); try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); result = sdf.parse(dateString); return result; }catch (Exception exception){ exception.getMessage(); } return result; } }
5、activity_wealth.xml
<ListView android:id="@+id/lv_wealth" android:layout_width="match_parent" android:layout_height="match_parent"></ListView>
6、item_wealth.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tv_buyDate" android:layout_marginTop="10dp" android:layout_marginLeft="10dp" android:text="2022-10-10" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="10dp"></TextView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginLeft="10dp" android:layout_marginBottom="10dp" android:layout_marginRight="10dp" android:background="@color/white" android:padding="10dp"> <LinearLayout android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="购买商品 皇室仙草 皇室仙草"></TextView> <TextView android:id="@+id/tv_detail_buyDate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="2022-10-10 10:10:10"></TextView> </LinearLayout> <TextView android:layout_marginTop="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="+300" android:textColor="@color/red_color" ></TextView> </LinearLayout> </LinearLayout>