我在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;
}
}
谢谢,请帮忙。 。 。 。 。
答案 0 :(得分:-1)
我没有审核过你的代码,但是这里有一个如何实现它的想法:
显然你无法真正最小化它,因为列表视图只显示部分视图,而实际的最小化视图量可能要大得多。
此外,在最小化了所有需要最小化的视图后,您不能将它们显示为空视图(height = 0),因为您的列表将为空。
因此,为了解决第二个问题,我建议操纵数据以排除这些视图。
第一个问题难以解决,你可能需要妥协一些方法。 您可以最小化所有可见视图,但是整个列表视图可能会变小或者在其中创建一个大厅。在最小化完成后,您将更新数据,并获得应该在繁荣中可见的视图的所有重置。 如果您有1或2个视图可以最小化,这可能会很有效,但通常这不是一个完美的想法。
另一种解决方案是忘记列表视图,实际上在内存中拥有所有视图,我认为这是实现它的唯一方法。
总的来说,这是一项非常艰巨的任务。