我有一个GridView,每行有3个元素,当我点击一个项目时,行下方会出现一个新视图。它有点像iOS上的文件夹应用程序。我没有在SO或Google上找到任何答案。也许你可以给我一些提示。
答案 0 :(得分:5)
您可以使用GridLayout
轻松完成此操作,但不能使用GridView
。
要在放置项目和设置列数之前找出网格的可用宽度,请设置ViewTreeObserver.OnGlobalLayoutListener
(可以放置项目)或扩展GridLayout并覆盖onMeasure (int widthMeasureSpec, int heightMeasureSpec)
在每行内容后插入一行,并将其可见性设置为Visibility.GONE
,并将columnSpec
设置为GridLayout
的列数。当用户点击某个项目时,您可以获取该信息,填充其下的视图并展开或动画显示其可见性切换。
最后,对于指标,我只是将其添加为隐藏行的子项,并且当用户点击项目时,计算所述项目的水平中心并将此视图的中心在X轴上精确地放置到该坐标(边距可以用于此)。
请注意,对于非常大的项目列表,建议不要这样做,因为您必须实例化每个要立即显示的项目,无论它们是否都适合屏幕。与GridView
不同,GridLayout
不是AbsListView
的孩子。
答案 1 :(得分:0)
虽然显然没有原生组件可以完成你想要做的事情,但是有几种方法可以通过组合其他方法来获得你想要的效果。
我能想到的一种方法是创建自己的适配器并添加功能,在点击标记有某种枚举的行下方插入3个元素,这样您就可以将它与常规视图区分开来,当然在getView方法中对于适配器,你必须进行验证才能知道哪个视图要膨胀并返回,刷新视图后,这3个元素将被插入到被点击的元素下面,当然你可以通过修改适配器列表来摆脱它们。显示。 (这种方法需要很好的自定义适配器知识,我做过这样的事情并且是一种干净而且很好的方法。)
这个问题的另一种方法不如第一个问题那么绝对可以做到这一点,通过创建一种你希望获得的效果的“模板”(就像图片中的那个) ),将该模板作为网格视图顶部活动的一部分保持不可见,一旦有人点击一个元素,相应地填充模板以显示您要显示的信息,使网格不可见并将“模板”显示在顶部对于网格,要显示正确填充的信息,用户不会注意到更改,当您想要返回到网格视图时,只需删除此“模板”视图,它就会产生效果网格就像它原来那样。
希望这有帮助。
问候!
答案 2 :(得分:0)
我使用TableLayout.addView添加一个ImageView,它可能需要另一个变量来删除View,目前我只是删除它并在点击按钮时添加另一个变量。
我根据位置更改了imageView,您可以根据该位置更改背景,以便用户将其视为与他们点击的相关
ImageView imag;
boolean imageOn = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imag = new ImageView(this);
final TableLayout table = (TableLayout) findViewById( R.id.tableLayoutCategoryButtons );
int buttonsInRow = 3;
String[] itemNames = getResources().getStringArray(R.array.categories_array);
int numRows=(itemNames.length/buttonsInRow);
if (itemNames.length%buttonsInRow!=0)
numRows++;
Button[] buttons = new Button[itemNames.length];
LinearLayout[] tablerowLayout = new LinearLayout[numRows];
tablerowLayout[0] = new LinearLayout(table.getContext());
int rowcount=0;
for (int i=0; i<itemNames.length; i++){
buttons[i]= new Button(table.getContext(), null, android.R.attr.buttonStyleSmall);
buttons[i].setText(itemNames[i]);
buttons[i].setId(i);
buttons[i].setTextColor(Color.BLACK);
buttons[i].setVisibility(View.VISIBLE);
buttons[i].setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(imageOn){
table.removeView(imag);
imageOn = false;
}
int index = v.getId()/buttonsInRow+1;
if(v.getId()%buttonsInRow==1)
imag.setImageResource(R.drawable.reta);
else if(v.getId()%buttonsInRow==2)
imag.setImageResource(R.drawable.reta2);
else
imag.setImageResource(R.drawable.reta3);
imageOn = true;
table.addView(imag, index);
}});
LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
tablerowLayout[rowcount].addView(buttons[i], buttonLayoutParams);
if (((i+1)%buttonsInRow==0)&&(i!=0)){
table.addView(tablerowLayout[rowcount++]);
if(rowcount<numRows)
tablerowLayout[rowcount] = new LinearLayout(table.getContext());
}
}
if(rowcount<numRows)
table.addView(tablerowLayout[rowcount]);