¿Cómo eliminar la línea de separación en footerLayout? Tengo un footerLayout debajo del listView, que se usa para mostrar el Monto total como se muestra a continuación. Si hago clic en la línea de separación en footerLayout, mi aplicación se bloquea.

enter image description here

Mi actividad principal

AllAdapter obj = new AllAdapter(getApplication(), search, listview,imageView,text,button);
footerLayout = (LinearLayout) getLayoutInflater().inflate(R.layout.under_listview, null);
totalAmount = (TextView) footerLayout.findViewById(R.id.amount);

Error de LogCat

 java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
            at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
            at java.util.ArrayList.get(ArrayList.java:304)
            at com.example.tony.monthlyexpenses.adapter.AllAdapter.getItem(AllAdapter.java:61)
            at com.example.tony.monthlyexpenses.QuickExpenses$1.onItemClick(QuickExpenses.java:88)
            at android.widget.AdapterView.performItemClick(AdapterView.java:301)

El error apuntó a listView onClickListener

 listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> listView, View view, final int position, long id) {
                mClickedPosition = position;
                Expenses o = (Expenses) obj.getItem(position);
                String day = o.getDate();
            }
        });

AllAdapter

 public Expenses getItem(int position) {
        return search.get(position);
    }

Se supone que footerLayout se muestra fuera de listView, no dentro. Cómo puedo deshacerme de esto ?

También tengo activity_main.xml, AllAdapter clase, all_adapter.xml para ListView y también under_listview.xml para el footerLayout.

actividad_principal

AllAdapter

under_listview

¿Cómo mover el footerLayout fuera de ListView?

Agrego que android:footerDividersEnabled="false" ahora se vuelve así

enter image description here

¡Pero aún se puede hacer clic!

enter image description here

1
Hoo 5 ene. 2017 a las 09:56

4 respuestas

La mejor respuesta

Se supone que footerLayout se muestra fuera de listView, no dentro.

En realidad, el pie de página también es parte de ListView y se suma a la cantidad de elementos que tiene la lista. Sin embargo, hay algunos enfoques sobre cómo ignorar los eventos de clic en una vista de pie de página.

Una opción es en lugar de agregar su vista usando:
addFooterView(footerLayout);,
uso:
addFooterView(footerLayout, null, false);

El tercer parámetro especifica si la vista de pie de página debe seleccionarse o no.

Otra opción sería ignorar el clic cuando el parámetro position es mayor que el tamaño de su conjunto de datos del adaptador:

 listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
     public void onItemClick(AdapterView<?> listView, View view, final int position, long id) {
          if(position < adapter.getCount()){ 
              Expenses expenses = (Expenses) adapter.getItem(position);
              String day = expenses.getDate();
          }
     }
 });
2
Andy Res 6 ene. 2017 a las 09:11


solo un tutorial rápido, si eres nuevo en ListViewAdapters personalizados.

Tendría un Objeto Expense como este:

class Expense {

  Date date = new Date();
  Double spendMoney = 5.0;
  Bitmap image;
  ...

  /** Continue with POJO **/
}

Y un diseño expenses_list_item.xml. (si necesita ayuda con eso, puedo agregarlo más tarde ...)


En mi MainActivity tendría un ArrayList<Expense> expensesList y
mi costumbre ArrayListAdapter se vería así:

class expenseListAdapter extends ArrayAdapter<Expense> {

    expenseListAdapter() {
        super(context, R.layout.expenses_list_item, expensesList);
    }

    @Override
    public View getView(int pos, View view, ViewGroup parent) {
        if (view == null) {
            view = getActivity().getLayoutInflater().inflate(R.layout.list_item_series, parent, false);
        }

        ShowListItem current = expensesList.get(pos);

        TextView expens = (TextView) view.findViewById(R.id.expenseText);
        expens.setText(current.getSpendMoney());

        ... (all other needed values of your Expense object)

        return view;
    }
}

Y finalmente, podría establecer

ArrayAdapter<Expense> adapter = new expenseListAdapter();
expenseListView.setAdapter(adapter);

Eso sería todo. Tal vez un poco complicado en el primer vistazo, pero este método es muy poderoso. Si necesita ayuda, no tenga miedo de preguntar;)

Saluda Malik

0
Malik 5 ene. 2017 a las 13:37

Cambio este código y funciona bien ahora.

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> listView, View view, final int position, long id) {
                Expenses o = (Expenses) listView.getAdapter().getItem(position);
                if(o != null){
                    mClickedPosition = position;
                    //Expenses o = (Expenses) obj.getItem(position);
                    String day = o.getDate();
                }
            }
        });
1
Hoo 6 ene. 2017 a las 08:05

Intente establecer la siguiente línea en su vista de lista.

            android:footerDividersEnabled="false"
1
Parin Parikh 5 ene. 2017 a las 15:19