7

行ごとに 3 つの要素を持つ GridView があり、項目をクリックすると、新しいビューが行の下に表示されます。iOS のフォルダ アプリケーションに少し似ています。SOやGoogleで答えが見つかりませんでした。多分あなたは私にいくつかのヒントを与えることができます.

ここに画像の説明を入力

4

3 に答える 3

0

私は TableLayout.addView を使用して ImageView を追加します。removeView には別の変数が必要な場合があります。現在、ボタンがクリックされたときにそれを削除して別の変数を追加するだけです。

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]);

コードに基づくシミュレーション

于 2013-07-11T02:16:39.543 に答える
0

ここでやりたいことを実現するためのネイティブ コンポーネントが存在しないことは明らかですが、他の方法を組み合わせて目的の効果を得る方法がいくつかあります。

私が考えることができる1つの方法は、独自のアダプターを作成し、クリックされた行の下に何らかの列挙型でタグ付けされた3つの要素を追加する機能を追加して、通常のビューと区別できるようにすることです。もちろん、アダプターのgetViewメソッドで、どのビューを膨張させて返すかを確認するために検証を行う必要があります。ビューを更新した後、これらの 3 つの要素はクリックされた要素の下に挿入されます。もちろん、アダプターが表示しているリストを変更することでそれらを取り除くことができます。(このアプローチには、カスタム アダプターに関する十分な知識が必要です。私はこのようなことを行っており、クリーンで優れたアプローチです)。

この問題への別のアプローチは、最初のものほど良くはありませんが、絶対にトリックを行うことです。取得したい効果の一種の「テンプレート」を作成することです(あなたが持っている写真のようなもの)。グリッドビュー上のアクティビティの一部としてそのテンプレートを非表示にします。誰かが要素をタップすると、表示したい情報に応じてテンプレートを埋め、グリッドを非表示にし、グリッドの上に「テンプレート」を表示します、表示したい情報が適切に入力されていると、ユーザーは変更に気付かず、グリッドビューに戻りたいときに、この「テンプレート」ビューを削除するだけで、グリッドが元通りに。

お役に立てれば。

よろしく!

于 2013-07-10T17:35:43.087 に答える