Не могу получить расширенную функциональность GridView - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть страница, где профили пользователей отображаются в GridView.Каждая сетка содержит профили пользователей (имя, идентификатор, возраст и т. Д.), А также кнопку, которая выводит нас на следующий экран.

Я реализовал функцию Расширения сетки так, что когда пользователь щелкает сетку, она расширяется.показать больше информации.Я ссылался на следующий код GitHub для расширенной функциональности: https://github.com/thewaychung/ExpandableGridView

Но когда я реализовал это в своем проекте, расширенный вид перекрывается с существующим видом сетки вместо того, чтобы показываться при щелчке элемента сетки..

Вот мой код:

public class MainActivity extends AppCompatActivity {
    GridView gv;
    FirebaseDatabase database;
    DatabaseReference db;
    FirebaseListAdapter adapter;
    FirebaseListAdapter childAdapter;
    Button t;
    GridView cv;
    TextInputLayout parentInfo;
    TextInputLayout childInfo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       final ExpandableGridView gv = findViewById(R.id.gridView);
       final GridView cv = findViewById(R.id.childView);
        t.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,Next.class);
                startActivity(i);
            }
        });
        //SETUP FIREBASE
        db = FirebaseDatabase.getInstance().getReference();
        Log.i("TEST", "TEST");
        Query query = FirebaseDatabase.getInstance().getReference().child("users");
        FirebaseListOptions<users> options = new FirebaseListOptions.Builder<users>()
                .setLayout(R.layout.users)
                .setLifecycleOwner(MainActivity.this)
                .setQuery(query, users.class)
                .build();
        //ADAPTER
        adapter = new FirebaseListAdapter(options) {
            @Override
            protected void populateView(@NonNull View v, @NonNull Object model, int position) {
                TextView name = v.findViewById(R.id.name);
                TextView age = v.findViewById(R.id.age);
                TextView mid = v.findViewById(R.id.mid);
                ImageView image = v.findViewById(R.id.userImage);
                image.setScaleType(ImageView.ScaleType.FIT_XY);
                TextView cont = v.findViewById(R.id.cont);
                users mt = (users) model;
                name.setText(" Name: "+ mt.getName());
                age.setText(" Age: "+ mt.getAge().toString());
                mid.setText(" ID: "+ mt.getMid());
                cont.setText(mt.getCount().toString());
                Picasso.with(MainActivity.this).load(mt.getImage()).into(image);
                Button d = v.findViewById(R.id.d);
                parentInfo = v.findViewById(R.id.parentInfo);
                parentInfo.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this,"This is the parent information",Toast.LENGTH_SHORT).show();
                    }
                });
                d.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent i = new Intent(MainActivity.this,Next.class);
                        startActivity(i);
                    }
                });
            }
        };
        gv.setAdapter(adapter);

        childAdapter = new FirebaseListAdapter(options) {
            @Override
            protected void populateView(@NonNull View v, @NonNull Object model, int position) {
                TextView name = v.findViewById(R.id.name);
                TextView age = v.findViewById(R.id.age);
                TextView mid = v.findViewById(R.id.mid);
                ImageView image = v.findViewById(R.id.userImage);
                image.setScaleType(ImageView.ScaleType.FIT_XY);
                TextView cont = v.findViewById(R.id.cont);
                users mt = (users) model;
                name.setText(" Name: "+mt.getName());
                age.setText(" Age: "+mt.getAge().toString());
                mid.setText(" ID: "+mt.getMid());
                cont.setText(mt.getCount().toString());
                Picasso.with(MainActivity.this).load(mt.getImage()).into(image);
                Button d = v.findViewById(R.id.d);
                childInfo = v.findViewById(R.id.parentInfo);
                childInfo.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this,"This is the child information",Toast.LENGTH_SHORT).show();
                    }
                });
            }
        };
        cv.setAdapter(childAdapter);

        final ExpandableGridView parentGridView = (ExpandableGridView)findViewById(R.id.gridView);
        gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //expand the grid view
                gv.expandGridViewAtView(view,childAdapter);
            }
        });
        //click event listener of sub gridview
        gv.setOnExpandItemClickListener(new ExpandableGridView.OnExpandItemClickListener() {
            @Override
            public void onItemClick(int position, Object clickPositionData) {
                Toast.makeText(getBaseContext(),clickPositionData.toString()+"clicked",Toast.LENGTH_LONG).show();
            }
        });
gv.setOnExpandItemClickListener(new ExpandableGridView.OnExpandItemClickListener() {
            @Override
            public void onItemClick(int position, Object clickPositionData) {
                Toast.makeText(getBaseContext(),clickPositionData.toString()+"clicked",Toast.LENGTH_LONG).show();
            }
        });


    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

По сути, childView перекрывает parentView, а не отображается при нажатии родительского элемента, т.е. элемента сетки.

Этомой обновленный код:

public class MainActivity extends AppCompatActivity {
    GridView gv;
    FirebaseDatabase database;
    DatabaseReference db;
    FirebaseListAdapter adapter;
    FirebaseListAdapter childAdapter;
    Button t;
    GridView cv;
    TextInputLayout parentInfo;
    TextView child;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button t = findViewById(R.id.payBtn);
       final ExpandableGridView gv = findViewById(R.id.gridView);
       //final GridView cv = findViewById(R.id.childView);
        t.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this,Next.class);
                startActivity(i);
            }
        });
        //SETUP FIREBASE
        db = FirebaseDatabase.getInstance().getReference();
        Log.i("TEST", "TEST");
        Query query = FirebaseDatabase.getInstance().getReference().child("users");
        FirebaseListOptions<users> options = new FirebaseListOptions.Builder<users>()
                .setLayout(R.layout.users)
                .setLifecycleOwner(MainActivity.this)
                .setQuery(query, users.class)
                .build();
        //ADAPTER
        adapter = new FirebaseListAdapter(options) {
            @Override
            protected void populateView(@NonNull View v, @NonNull Object model, int position) {
                TextView name = v.findViewById(R.id.name);
                TextView age = v.findViewById(R.id.age);
                TextView mid = v.findViewById(R.id.mid);
                ImageView image = v.findViewById(R.id.userImage);
                image.setScaleType(ImageView.ScaleType.FIT_XY);
                TextView cont = v.findViewById(R.id.cont);
                users mt = (users) model;
                name.setText(" Name: "+ mt.getName());
                age.setText(" Age: "+ mt.getAge().toString());
                mid.setText(" ID: "+ mt.getMid());
                cont.setText(mt.getCount().toString());
                Picasso.with(MainActivity.this).load(mt.getImage()).into(image);
                Button d = v.findViewById(R.id.d);
                parentInfo = v.findViewById(R.id.parentInfo);
                parentInfo.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this,"This is the parent information",Toast.LENGTH_SHORT).show();
                    }
                });
                d.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent i = new Intent(MainActivity.this,Payment.class);
                        startActivity(i);
                    }
                });
            }
        };
        gv.setAdapter(adapter);

        childAdapter = new FirebaseListAdapter(options) {
            @Override
            protected void populateView(@NonNull View v, @NonNull Object model, int position) {
                TextView field = v.findViewById(R.id.field);
                users mt = (users) model;
                field.setText(" Field: "+ mt.getField());
                child = v.findViewById(R.id.field);
                child.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this,"This is the child information",Toast.LENGTH_SHORT).show();
                    }
                });
            }
        };
  
        //final ExpandableGridView parentGridView = (ExpandableGridView)findViewById(R.id.gridView);
        gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //expand the grid view
                gv.expandGridViewAtView(view,childAdapter);
            }
        });
        //click event listener of sub gridview
        gv.setOnExpandItemClickListener(new ExpandableGridView.OnExpandItemClickListener() {
            @Override
            public void onItemClick(int position, Object clickPositionData) {
                Toast.makeText(getBaseContext(),clickPositionData.toString()+"clicked",Toast.LENGTH_LONG).show();
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

1 Ответ

0 голосов
/ 12 февраля 2019

Вы получаете неправильную идею здесь.Вам просто нужно 1 расширяемое представление сетки и 2 адаптера: 1 для родителя и 1 для ребенка, как в ссылке, которой вы делитесь

ExpandableGridView countryGridView = (ExpandableGridView)findViewById(R.id.country_grid);
 ArrayAdapter<String> countryAdapter = new ArrayAdapter<String>(getBaseContext(),R.layout.grid_item, R.id.grid_item, countryData);

 // 1.Set adapter for the grid view
 countryGridView.setAdapter(countryAdapter);

 // 2.Add click event listener to the grid view, expand grid view when item is clicked
 countryGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         // expand the grid view
         countryGridView.expandGridViewAtView(view, new ArrayAdapter<String>(getBaseContext(),
                 R.layout.grid_item, R.id.grid_item, stateData));
     }
 });

То, как вы делаете, вы включаете 2 вида сетки, поэтому вам просто нужно удалить обычныйвид сетки.Удалите R.id.childView из вашего кода.

...