我尝试实施FloatingGroupExpandableListView,但我无法根据自定义列表视图对其进行修改。
以下代码在列表中实现了两种类型的标头。
嗯,实现2种类型的标题对我来说是一项复杂的任务。现在,实现FloatingGroupExpandableListView
并非易事,我无法根据自定义列表视图自定义代码。
请参阅MyCustomAdapter
课程,&请告诉我如何修改它以完成我的任务?
public class ContentsFragment extends ListFragment implements OnTouchListener {
private MyCustomAdapter mAdapter;
Activity temp = getActivity();
String []s = new String[500];
ArrayList<GS> q = new ArrayList<GS>();
ListView lv;
int count=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DBAdapter db = DBAdapter.getDBAdapter(getActivity());
if (!db.checkDatabase())
db.createDatabase(getActivity());
db.openDatabase();
q = db.getData();
mAdapter = new MyCustomAdapter(getActivity());
mAdapter.addSeparatorItem(new ContentWrapper(q.get(0).getA_name(),null,null));//1st type of seperator
mAdapter.addItem(new ContentWrapper(q.get(0).getAS_name(), q.get(0).getDesc_art(),null));
for (int i = 1; i <= 14; i++) {
if (!(q.get(i).getA_name().trim().equals(q.get(i-1).getA_name().trim()))) {
mAdapter.addSeparatorItem(new ContentWrapper(q.get(i).getA_name(), null,null));//2nd type of separator
}
if(!(q.get(i).getExtra()==null))
mAdapter.addGraySeparatorItem(new ContentWrapper(q.get(i).getExtra(),null,null));
mAdapter.addItem(new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art(),null));
}
for (int i = 15; i < 236; i++) {
if (!(q.get(i).getA_name().trim().equals(q.get(i-1).getA_name().trim()))) {
mAdapter.addSeparatorItem(new ContentWrapper(q.get(i).getA_name(), null,null));
}
if(!(q.get(i).getExtra()==null))
mAdapter.addGraySeparatorItem(new ContentWrapper(q.get(i).getExtra(),null,null));
mAdapter.addItem(new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art(),null));
}
//Adapter Class
private class MyCustomAdapter extends BaseAdapter {
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_GRAY_SEPARATOR = 2;
private static final int TYPE_MAX_COUNT = TYPE_GRAY_SEPARATOR + 1;
private TreeSet<Integer> mGraySeparatorsSet = new TreeSet<Integer>();
private ArrayList<ContentWrapper> mData = new ArrayList<ContentWrapper>();
private LayoutInflater mInflater;
private TreeSet<Integer> mSeparatorsSet = new TreeSet<Integer>();
public MyCustomAdapter(Context context)
{
mInflater = LayoutInflater.from(context);
}
public void addItem(ContentWrapper value) {
mData.add(value);
notifyDataSetChanged();
}
public void addSeparatorItem(ContentWrapper value) {
mData.add(value);
// save separator position
mSeparatorsSet.add(mData.size() - 1);
notifyDataSetChanged();
}
public void addGraySeparatorItem(ContentWrapper value) {
mData.add(value);
// save separator position
mGraySeparatorsSet.add(mData.size() - 1);
notifyDataSetChanged();
}
public ContentWrapper getItem(int position) {
return mData.get(position);
}
@Override
public int getItemViewType(int position) {
int viewType = TYPE_ITEM;
if(mSeparatorsSet.contains(position))
viewType = TYPE_SEPARATOR;
else if(mGraySeparatorsSet.contains(position)) {
viewType = TYPE_GRAY_SEPARATOR;
}
return viewType;
// return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}
@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}
public int getCount() {
return mData.size();
}
public long getItemId(int position) {
Log.v("getItemId Position", ""+position);
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_ITEM:
convertView = mInflater.inflate(R.layout.white, null);
holder.textView = (TextView)convertView.findViewById(R.id.text);
break;
case TYPE_SEPARATOR:
convertView = mInflater.inflate(R.layout.black, null);
holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
break;
case 2:
convertView = mInflater.inflate(R.layout.gray, null);
holder.textView = (TextView)convertView.findViewById(R.id.textViewGray);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
} holder.textView.setText(mData.get(position).getItem());
getListView().setFastScrollEnabled(true);
if (type == TYPE_ITEM) {
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { // for printing details in alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setIcon(R.drawable.ic_launcher);
final String title = mData.get(position).getItem();
builder.setTitle(title);
builder.setMessage(mData.get(position).getItemDescription());
builder.setCancelable(false);
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
AlertDialog alertDialog = (AlertDialog) dialog;
ViewGroup viewGroup = (ViewGroup) alertDialog.getWindow()
.getDecorView();
TextView textView = findTextViewWithTitle(viewGroup, title);
if (textView != null) {
textView.setEllipsize(null);
textView.setMaxHeight((int) (100 * alertDialog.getContext().getResources().getDisplayMetrics().density));
textView.setMovementMethod(new ScrollingMovementMethod());
}
}
});
alertDialog.show();
}
//Customised Alert dialog
private TextView findTextViewWithTitle(ViewGroup viewGroup, String title) {
for (int i = 0, N = viewGroup.getChildCount(); i < N; i++) {
View child = viewGroup.getChildAt(i);
if (child instanceof TextView) {
TextView textView = (TextView) child;
if (textView.getText().equals(title)) {
return textView;
}
} else if (child instanceof ViewGroup) {
ViewGroup vGroup = (ViewGroup) child;
return findTextViewWithTitle(vGroup, title);
}
}
return null;
}
});
}else if(type == 1) {
holder.textView.setOnClickListener(null);
}
else
{
holder.textView.setOnClickListener(null);
}
return convertView;
}
}
public static class ViewHolder {
public TextView textView;
public TextView header;
int previousTop = 0;
}
public boolean onTouch(View v, MotionEvent event) {
return false;
}
}
}
正如你所看到的,有2种类型的标题(1种黑色和1种灰色),白色儿童。
黑色背景,灰色背景&amp;白色背景所有sh是绿色背景的子视图(它是floatingGroupExpandableHeader)(相对布局id sample_activity_list_group_item_background)! 1-30的视图属于第1部分,因此绿色背景文本是第1部分(floatingGroupExpandableHeader),其子项为1到30,无论天气如何,它都是黑色背景,灰色背景或白色背景!然后在视图31中,我想添加另一个带有文本作为第2部分的floatGroupExpandableHeader(来自31-60的子视图),我希望我想要实现的目标是明确的!
对于FloatingGroupExpandableListView,我的xml文件已准备好,我不想添加任何页眉或页脚,
sample_activity_list_group_item.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="horizontal" >
<RelativeLayout
android:id="@+id/sample_activity_list_group_item_background"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:background="#FFA2C955"
android:orientation="horizontal" >
<TextView
android:id="@+id/sample_activity_list_group_item_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:textColor="#FFFFFFFF"
android:textSize="20sp" />
<ImageView
android:id="@+id/sample_activity_list_group_expanded_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="20dp" />
</RelativeLayout>
</LinearLayout>
sample_activity.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="match_parent"
android:background="#FFEDEDED"
android:orientation="vertical" >
<com.diegocarloslima.fgelv.lib.FloatingGroupExpandableListView
android:id="@+id/sample_activity_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:cacheColorHint="@android:color/transparent"
android:childDivider="#FF000000"
android:divider="#FF000000"
android:dividerHeight="1dp"
android:paddingLeft="10dp"
android:paddingTop="10dp" />
</LinearLayout>
现在我应该在课堂上添加/修改什么?
请帮助我,
提前致谢。
答案 0 :(得分:0)
尝试FloatingGroupExpandableListView
我发现这是最好的实现。 这使用反射来完成这项工作。 只需要使用android GroupExpandableListView和BaseExpandableListAdapter。
List<ContentWrapper> items = new ArrayList<ContentWrapper>();
ContentWrapper group;
for (int i = 1; i <= 14; i++) {
if (!(q.get(i).getA_name().trim().equals(q.get(i-1).getA_name().trim()))) {
group = new ContentWrapper(q.get(i).getA_name(), null,null));
}
ContentWrapper item = new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art(),null);
if(!(q.get(i).getExtra()==null))
item.setShowGraySeparator();//the gray separator should be merged with item view;
items.add(item);
}
mAdapter.addGroup(group,items);
public class CustomExpandableListAdapter extends BaseExpandableListAdapter {
private List<ContentWrapper> mGroups = new ArrayList<ContentWrapper>();
private List<List<ContentWrapper>> mData = new ArrayList<List<ContentWrapper>>();
public void addGroup(ContentWrapper group,List<ContentWrapper> items) {
mGroups.add(group);
mData.add(items);
}
@Override
public int getGroupCount() {
// sticky header count
return mGroups.size();
}
@Override
public int getChildrenCount(int groupPosition) {
// child count for each group at 'groupPosition'
mData.get(groupPosition).size();
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
//sticky header view at 'groupPosition'
ContentWrapper header = mGroups.get(groupPosition);
//show group view
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
//child view at 'childPosition' for 'groupPosition'
ContentWrapper item = mData.get(groupPosition).get(childPosition);
// show item view
}
}
答案 1 :(得分:-1)
看看这个实现:https://github.com/beworker/pinned-section-listview 它要求您的适配器只使用一种方法实现接口:
public boolean isItemViewTypePinned(int viewType)
因此,您可以轻松地将此库集成到您的代码中。