将头实现为FloatingGroupExpandableListView

时间:2014-06-24 08:40:15

标签: android android-listview

我在ListFragment中有一个自定义列表视图,有3种类型的标题(1st.Green Background,2nd.Black Background,3rd.Gray background),正如您在video中看到的那样。

我想自定义绿色标题,即点击绿色标题时,必须最小化下一个绿色标题之间的所有视图(项目),&再次点击那个绿色标题,应该放弃最小化的视图。

FloatingGroupExpandableListView这样使用一些虚拟物品的功能,在我的情况下,必须自定义视图。

我不知道如何修改我的代码来完成这项任务。

public class ContentsFragment extends ListFragment  implements OnTouchListener
{
final Context context = getActivity();
    private MyCustomAdapter mAdapter;
    Activity temp = getActivity();
    TextView tv1,tv3;
    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.addGreenSeparatorItem(new ContentWrapper("PART I", null, null, null, null));//group
     mAdapter.addSeparatorItem(new ContentWrapper(q.get(0).getA_name(),null,null,null,null));//child
     mAdapter.addItem(new ContentWrapper(q.get(0).getAS_name(), q.get(0).getDesc_art(),q.get(0).getExtra(),q.get(0).getPart(),q.get(0).getItalic()));//child


     for (int i = 1; i <= 14; i++) {
  if(i==5) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART II", null, null, null, null));
  if(i==12) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART III", null, null, null, null));

      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,null,null));
     }
     if(!(q.get(i).getExtra()==null))
  mAdapter.addGraySeparatorItem(new ContentWrapper(q.get(i).getExtra(),null,null,null,null));//child

     mAdapter.addItem(new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art(),q.get(i).getExtra(),q.get(i).getPart(),q.get(i).getItalic()));
   }
   for (int i = 15; i < 36; 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,null,null));

  }
  if(!(q.get(i).getExtra()==null))
      mAdapter.addGraySeparatorItem(new ContentWrapper(q.get(i).getExtra(),null,null,null,null));


  mAdapter.addItem(new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art(),q.get(i).getExtra(),q.get(i).getPart(),q.get(i).getItalic()));

    }

      mAdapter.addItem(new ContentWrapper(q.get(460).getAS_name(), q.get(460).getDesc_art(),q.get(460).getExtra(),q.get(460).getPart(),q.get(460).getItalic()));


   for (int i=36; i < 158; i++) {
    if(i==41) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART IV", null, null, null, null));//group
if(i==60) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART IVA", null, null, null, null));//group
if(i==61) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART V", null, null, null, null));


  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,null,null));

  }
   if(!(q.get(i).getExtra()==null))
      mAdapter.addGraySeparatorItem(new ContentWrapper(q.get(i).getExtra(),null,null,null,null));


  mAdapter.addItem(new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art(),q.get(i).getExtra(),q.get(i).getPart(),q.get(i).getItalic()));

    }
          mAdapter.addItem(new ContentWrapper(q.get(461).getAS_name(), q.get(461).getDesc_art(),q.get(461).getExtra(),q.get(461).getPart(),q.get(461).getItalic()));

     for (int i=158; i < 210; i++) {
  if(i==163) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART VI", null, null, null, null));

  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,null,null));

  }
   if(!(q.get(i).getExtra()==null))
      mAdapter.addGraySeparatorItem(new ContentWrapper(q.get(i).getExtra(),null,null,null,null));


  mAdapter.addItem(new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art(),q.get(i).getExtra(),q.get(i).getPart(),q.get(i).getItalic()));

    }
      mAdapter.addItem(new ContentWrapper(q.get(462).getAS_name(), q.get(462).getDesc_art(),q.get(462).getExtra(),q.get(462).getPart(),q.get(462).getItalic()));

     for (int i=210; i < 218; 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,null,null));

  }
   if(!(q.get(i).getExtra()==null))
      mAdapter.addGraySeparatorItem(new ContentWrapper(q.get(i).getExtra(),null,null,null,null));

  mAdapter.addItem(new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art(),q.get(i).getExtra(),q.get(i).getPart(),q.get(i).getItalic()));

    }
      mAdapter.addItem(new ContentWrapper(q.get(463).getAS_name(), q.get(463).getDesc_art(),q.get(463).getExtra(),q.get(463).getPart(),q.get(463).getItalic()));
      for (int i=218; i < 244; 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,null,null));

  }
   if(!(q.get(i).getExtra()==null))
      mAdapter.addGraySeparatorItem(new ContentWrapper(q.get(i).getExtra(),null,null,null,null));

  mAdapter.addItem(new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art(),q.get(i).getExtra(),q.get(i).getPart(),q.get(i).getItalic()));

    }
      mAdapter.addItem(new ContentWrapper(q.get(464).getAS_name(), q.get(464).getDesc_art(),q.get(464).getExtra(),q.get(464).getPart(),q.get(464).getItalic()));

      for (int i=244; i < 459; i++) {
if(i==248) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART VII", null, null, null, null));
if(i==249) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART VIII", null, null, null, null));
if(i==257) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART IX", null, null, null, null));
if(i==273) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART IXA", null, null, null, null));
if(i==291) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART X", null, null, null, null));
if(i==293) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XI", null, null, null, null));
if(i==314) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XII", null, null, null, null));
if(i==353) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XIII", null, null, null, null));
if(i==360) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XIV", null, null, null, null));
if(i==377) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XIVA", null, null, null, null));
if(i==379) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XV", null, null, null, null));
if(i==386) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XVI", null, null, null, null));
if(i==400) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XVII", null, null, null, null));
if(i==421) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XIX", null, null, null, null));
if(i==431) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XX", null, null, null, null));
if(i==432) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XXI", null, null, null, null));
if(i==455) mAdapter.addGreenSeparatorItem(new ContentWrapper("PART XXII", null, null, null, null));

  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,null,null));

  }
   if(!(q.get(i).getExtra()==null))
      mAdapter.addGraySeparatorItem(new ContentWrapper(q.get(i).getExtra(),null,null,null,null));

  mAdapter.addItem(new ContentWrapper(q.get(i).getAS_name(), q.get(i).getDesc_art(),q.get(i).getExtra(),q.get(i).getPart(),q.get(i).getItalic()));

    }

setListAdapter(mAdapter);



 }

 //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_GREEN_SEPARATOR = 3;
 private static final int TYPE_MAX_COUNT = TYPE_GREEN_SEPARATOR + 1;
 private TreeSet<Integer> mSeparatorsSet = new TreeSet<Integer>();

 private TreeSet<Integer> mGraySeparatorsSet = new TreeSet<Integer>();

 private TreeSet<Integer> mGreenSeparatorsSet = new TreeSet<Integer>();


 private ArrayList<ContentWrapper> mData = new ArrayList<ContentWrapper>();
 private LayoutInflater mInflater;


 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 void addGreenSeparatorItem(ContentWrapper value) {
    mData.add(value);
    // save separator position
    mGreenSeparatorsSet.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; 
    else if(mGreenSeparatorsSet.contains(position)) 
        viewType = TYPE_GREEN_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;
        case 3:
            convertView = mInflater.inflate(R.layout.green, null);
            holder.textView = (TextView)convertView.findViewById(R.id.textSeparatorGreen);
            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) 

            {
                    final Dialog dialog = new Dialog(getActivity());
                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                dialog.setContentView(R.layout.description);

              TextView desc = (TextView) dialog.findViewById(R.id.textView3);
                TextView part = (TextView) dialog.findViewById(R.id.textView1);
                TextView italic = (TextView) dialog.findViewById(R.id.textView2);
                TextView title = (TextView) dialog.findViewById(R.id.textView4);

                      italic.setTypeface(null, Typeface.ITALIC);
                title.setText(mData.get(position).getItem());
                desc.setText(mData.get(position).getItemDescription());
                part.setText(mData.get(position).getPart());
                italic.setText(mData.get(position).getItalic());

          dialog.show();
         dialog.setCancelable(true);
     dialog.setCanceledOnTouchOutside(true);

            }
       });

    }else if(type == 1) {
        holder.textView.setOnClickListener(null);
    }
    else  if(type == 2)
    {
        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) {
// TODO Auto-generated method stub
return false;
}
}

谢谢,请帮忙。 。 。 。 。

1 个答案:

答案 0 :(得分:-1)

我没有审核过你的代码,但是这里有一个如何实现它的想法:

显然你无法真正最小化它,因为列表视图只显示部分视图,而实际的最小化视图量可能要大得多。

此外,在最小化了所有需要最小化的视图后,您不能将它们显示为空视图(height = 0),因为您的列表将为空。

因此,为了解决第二个问题,我建议操纵数据以排除这些视图。

第一个问题难以解决,你可能需要妥协一些方法。 您可以最小化所有可见视图,但是整个列表视图可能会变小或者在其中创建一个大厅。在最小化完成后,您将更新数据,并获得应该在繁荣中可见的视图的所有重置。 如果您有1或2个视图可以最小化,这可能会很有效,但通常这不是一个完美的想法。

另一种解决方案是忘记列表视图,实际上在内存中拥有所有视图,我认为这是实现它的唯一方法。

总的来说,这是一项非常艰巨的任务。