无法使用registerForContextMenu从ListView中单击项目

时间:2015-01-28 12:01:40

标签: android multithreading listview

我已经花了3个小时试图解决这个问题,但似乎我无法解决。

我的问题是我无法点击ListView中的项目。我在其他活动中使用完全相同的代码,我确实可以点击它们。我无法弄清楚发生了什么。

这是我的代码:

ListViewXML

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="razvitrance.ownnavdrawertest.PantallaAdministrarMedicamentos"
    android:id="@+id/drawerLayout">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_margin="15dp"
        android:gravity="center|top">

        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Añadir Cita"
            android:id="@+id/aniadirCitaAdministrarButton"
            android:focusable="false"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Citas pendientes"
            android:id="@+id/textView10"
            android:textSize="24dp" />

        <ListView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/citasPendientes" />

    </LinearLayout>

    <ListView
        android:background="@color/appBackground"
        android:id="@+id/navDrawerList"

        android:layout_width="300dp"
        android:layout_height="fill_parent"
        android:layout_gravity="start">
    </ListView>


</android.support.v4.widget.DrawerLayout>

我用于在ListView中显示的项目:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

            <ImageButton
                android:layout_width="71dp"
                android:layout_height="71dp"
                android:id="@+id/imageButton"
                android:background="@drawable/ic_calendario" />

            <LinearLayout
                android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:gravity="center">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:text="Medium Text"
                    android:id="@+id/mostrarLugarCitaListView"
                    android:textStyle="italic" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:text="Medium Text"
                    android:id="@+id/mostrarFechaCitaListView" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:text="Medium Text"
                    android:id="@+id/mostrarHoraCitasListView" />
            </LinearLayout>

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

最后是我完全设置的课程。我通过httpPost访问数据库,这就是我使用线程的原因。

package razvitrance.ownnavdrawertest;

import android.content.Intent;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class PantallaAdministrarCitas extends NavDrawerSetup implements View.OnClickListener {

    private Button añadirCitas;
    private ListView citasPendietesList;
    private ArrayList<HashMap<String, String>> listaCitas;
    private ArrayList<String> indiceCitas, arrayNombreCitas;
    private final String TAG_SUCCESS = "success", TAG_CITAS = "citas", TAG_INDICE = "CitasID", TAG_DNI = "DNI", TAG_LUGAR = "lugar", TAG_FECHA = "Fecha", TAG_HORA = "hora";
    private Long lastSelectedId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pantalla_administrar_citas);
        super.onCreateDrawer();


        citasPendietesList = (ListView) findViewById(R.id.citasPendientes);
        registerForContextMenu(citasPendietesList);


        new CargarCitas().execute();


        añadirCitas = (Button) findViewById(R.id.aniadirCitaAdministrarButton);
        añadirCitas.setOnClickListener(this) ;


    }

    @Override
    public void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo
            menuInfo){
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        lastSelectedId = info.id;
        menu.add("BORRAR");
    }

    @Override
    public boolean onContextItemSelected (MenuItem item){
        if (item.getTitle() == "BORRAR") {
            //Le pasamosal thread el parámetro como argumento de su método doInBackground. Estará en params[0]
            new BorrarCita().execute(indiceCitas.get(lastSelectedId.intValue()), arrayNombreCitas.get(lastSelectedId.intValue()));
            Toast.makeText(this, "Cita borrado.", Toast.LENGTH_SHORT).show();
            finish();
            //todo || no sé si esta es la mejor forma de refrescar la listView, por el momento no me funciona otra.
            Intent refrescarPantalla = new Intent(getApplicationContext(), PantallaAdministrarMedicamentos.class);
            startActivity(refrescarPantalla);
        }
        return (super.onOptionsItemSelected(item));
    }

        @Override
        public void onClick (View v){
            switch (v.getId()) {

                case R.id.aniadirCitaAdministrarButton:
                    finish();
                    Intent aniadirCitas = new Intent(getApplicationContext(),PantallaAniadirCitas.class);
                    startActivity(aniadirCitas);
                    break;


            }
        }



        @Override
        public boolean onCreateOptionsMenu (Menu menu){
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_pantalla_administrar_citas, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected (MenuItem item){
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();

            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }

            return super.onOptionsItemSelected(item);
        }

        class CargarCitas extends AsyncTask<String, String, String> {
            protected String doInBackground(String... args) {
                //Hay que añadirle las comillas "DNI" para hacer la búsqueda SELECT *FROM historial WHERE DNI = "DNI"
                String dni = PantallaMenuPrincipal.dniUsuario;
                listaCitas = new ArrayList<>();
                indiceCitas = new ArrayList<>();
                arrayNombreCitas = new ArrayList<>();

                JSONParser jsonParser = new JSONParser();

                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair(TAG_DNI, dni));

                // getting JSON Object
                // Note that create product url accepts POST method
                JSONObject json = jsonParser.makeHttpRequest(VariablesDeConexion.ObtenerCitasURL,
                        "POST", params);

                // check log cat for response
                Log.e("MEDICAMENTOS", json.toString());

                // check for success tag
                try {
                    int success = json.getInt(TAG_SUCCESS);

                    if (success == 1) {
                        // successfully created product
                        //Toast.makeText(PantallaNuevoUsuario.this, "Usuario añadido correctamente.", Toast.LENGTH_SHORT).show();
                        JSONArray medicamentos = json.getJSONArray(TAG_CITAS);

                        // looping through All Products
                        for (int i = 0; i < medicamentos.length(); i++) {
                            JSONObject c = medicamentos.getJSONObject(i);

                            // Storing each json item in variable

                            String lugar = "Cita en: " + c.getString(TAG_LUGAR);
                            String hora = "Hora: " + c.getString(TAG_HORA);
                            String fecha = "El día: " + c.getString(TAG_FECHA);
                            String indice = c.getString(TAG_INDICE);
                            String nombre = (c.getString(TAG_DNI) + c.getString(TAG_HORA).replace(":", "-")).trim();


                            Log.e("NOMBRE CREADO PARA COMPARACIÓN", nombre);


                            indiceCitas.add(indice);
                            arrayNombreCitas.add(nombre);


                            // creating new HashMap
                            HashMap<String, String> map = new HashMap<>();

                            // adding each child node to HashMap key => value
                            map.put(TAG_LUGAR, lugar);
                            map.put(TAG_HORA, hora);
                            map.put(TAG_FECHA, fecha);

                            // adding HashList to ArrayList
                            listaCitas.add(map);
                        }

                    } else {
                        // failed to create product
                        //Toast.makeText(PantallaNuevoUsuario.this, "Error al añadir usuario.", Toast.LENGTH_SHORT).show();

                        finish();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                return null;
            }

            @Override
            protected void onPostExecute(String s) {
                SimpleAdapter adapter = new SimpleAdapter(
                        PantallaAdministrarCitas.this, listaCitas,
                        R.layout.list_items_mostrarcitas, new String[]{TAG_LUGAR,
                        TAG_HORA, TAG_FECHA},
                        new int[]{R.id.mostrarLugarCitaListView, R.id.mostrarHoraCitasListView, R.id.mostrarFechaCitaListView});
                // updating listview
                citasPendietesList.setAdapter(adapter);

            }
        }

        class BorrarCita extends AsyncTask<String, String, String> {

            @Override
            protected String doInBackground(String... params) {
                borrarCita(params[1]);
                //En params[0] estará el MedId que quiero borrar ya que se ha pasado como parámetro.
                JSONParser jsonParser = new JSONParser();
                // Obtener los parámetros
                List<NameValuePair> parameters = new ArrayList<NameValuePair>();
                parameters.add(new BasicNameValuePair(TAG_INDICE, params[0]));
                Log.e("ESTO ES LO QUE SE LA PASA TAL CUAL AL MÉTODO POST", TAG_INDICE + params[0]);
                //JSONObject json = jsonParser.getJSONFromUrl(loginURL, params);
                //String loginURL = "http://192.168.0.13//android/IndexLogin.php";
                JSONObject json = jsonParser.makeHttpRequest(VariablesDeConexion.BorrarCitaURL, "POST", parameters);
                Log.d("Create Response Razvi -> Esto es lo que se recibe :", json.toString());
                return null;
            }

            private void borrarCita(String Name) {
                File f = new File(Environment.getExternalStorageDirectory().getPath() + "/Med/" + extractorLastUser() + "/Citas/" + Name);
                if (f.exists()) {
                    f.delete();
                }


            }

            private String extractorLastUser() {
                try {

                    File f;
                    FileReader lectorArchivo;

                    f = new File(Environment.getExternalStorageDirectory().getPath() + "/Med/last_user");
                    f.setReadable(true);
                    lectorArchivo = new FileReader(f);
                    BufferedReader br = new BufferedReader(lectorArchivo);
                    String l = "";
                    String aux = "";/*variable auxiliar*/

                    while (true) {
                        aux = br.readLine();
                        if (aux != null) {
                            l = l + aux + "";
                        } else {
                            br.close();
                            lectorArchivo.close();
                            return l;
                        }
                    }

                } catch (IOException e) {
                    System.out.println("Error:" + e.getMessage());
                    return null;
                }


            }
        }
    }

如果有人发现错误我非常感谢。

2 个答案:

答案 0 :(得分:0)

您必须比较您的menuItem标题:

    if(item.getTitle().toString().equals("BORRAR"))

如果您需要比较字符串或文本,则只能将其与equals()

进行比较

答案 1 :(得分:0)

我终于找到了解决方案。

问题是ImageView。我不知道为什么,但这个imageview打破了整个列表视图。它已正确显示,但无法单击任何项​​目。我只是删除了imageview,没有给出任何问题。