Listview con un icono y texto

Tengo un Listview que me trae un campo de texto de un servidor Web y lo muestra en el respectivo `listview ahora el asunto es que deseo agregar un icono mas el texto al lisview, pero hay que considerar que el icono se agregara siempre y cuando encuentre texto.

 private class AsyncRefrescar extends AsyncTask<String, String, String> {
    ProgressDialog pdLoading = new ProgressDialog(VerPreguntas.this);
    HttpURLConnection conn;
    URL url = null;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();



    }


    @Override
    protected String doInBackground(String... params) {
        try {

            url = new URL("http://bdauditorio.esy.es/Verpregunta/mostrarpre.php");

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return e.toString();
        }
        try {


            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(READ_TIMEOUT);
            conn.setConnectTimeout(CONNECTION_TIMEOUT);
            conn.setRequestMethod("GET");


            conn.setDoOutput(true);

        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return e1.toString();
        }

        try {

            int response_code = conn.getResponseCode();


            if (response_code == HttpURLConnection.HTTP_OK) {


                InputStream input = conn.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(input));
                StringBuilder result = new StringBuilder();
                String line;

                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }


                return (result.toString());

            } else {

                return ("unsuccessful");
            }

        } catch (IOException e) {
            e.printStackTrace();
            return e.toString();
        } finally {
            conn.disconnect();
        }


    }


    @Override
    protected void onPostExecute(String result) {


        if(result.equals("unsuccessful")) {
            final AlertDialog.Builder alertaDeError = new AlertDialog.Builder(VerPreguntas.this);
            alertaDeError.setTitle("Error");
            alertaDeError.setMessage("Ups, no se han podido cargar las preguntas. Intentelo de nuevo.");
            alertaDeError.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                }
            });
            alertaDeError.create();
            alertaDeError.show();
        }else{
            //Existen Datos

            List<String> preguntas = new ArrayList<String>();

            //Parsea la respuesta obtenida por el Asynctask
            JSONArray jsonArray = null;
            try {
                jsonArray = new JSONArray(result);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            for (int i=0; i<jsonArray.length(); i++) {
                JSONObject preguntaDatos = null;
                try {
                    preguntaDatos = jsonArray.getJSONObject(i);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                String pregunta = null;
                try {
                    pregunta = preguntaDatos.getString("pregunta");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                preguntas.add(pregunta);
            }
            //crear el Adapter.
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(VerPreguntas.this,
                    android.R.layout.simple_list_item_1, preguntas);
            //Asignas el Adapter a tu ListView para mostrar los datos.
            mostrarr.setAdapter(adapter);



        }
    }

}
1
задан 23.12.2016, 22:19
0 ответов

чтобы этого добиваться ты должен делать один CustomAdapter для тебя listview

Первый ты создаешь layout, с которым ты хочешь, чтобы каждая статья твоего списка имела, это визуальный формат, который ты хочешь дать ему каждой из твоих статей.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="Marshmallow"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textColor="@android:color/black" />


    <ImageView
        android:id="@+id/imagen"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@android:drawable/ic_dialog_info" />


</RelativeLayout>

В этом случае, давайте верить в один TextView для текста и одного ImageView для значка.

После давайте верить в класс, который сошлется на Objecto, у этого объекта есть два свойства txt и imagen

public class Modelo {

    String txt;
    String imagen;

    public Modelo(){
    }

    public Modelo(String txt, String imagen) {
        this.txt=txt;
        this.imagen=imagen;
    }

    public String getTxt() {
        return txt;
    }

    public String getImagen() {
        return imagen;
    }

    public void setTxt(String txt){
        this.txt = txt;
    }

    public void setImagen(String imagen){
        this.imagen = imagen;
    }
}

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

public class CustomAdapter extends ArrayAdapter<Modelo> {

    private ArrayList<Modelo> dataSet;
    Context mContext;

    // View lookup cache
    private static class ViewHolder {
        TextView txt;
        ImageView imagen;    
    }

    public CustomAdapter(ArrayList<Modelo> data, Context context) {
        super(context, R.layout.row_item, data);
        this.dataSet = data;
        this.mContext=context;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        //Obtenemos el item de acuerdo a su posicion.
        Model dataModel = getItem(position);
        ViewHolder viewHolder;

        final View result;

        if (convertView == null) {

            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.row_item, parent, false);
            viewHolder.txt = (TextView) convertView.findViewById(R.id.txt);
            viewHolder.imagen = (ImageView) convertView.findViewById(R.id.imagen);

            result = convertView;

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
            result = convertView;
        }

        viewHolder.txt.setText(dataModel.getName());
        //En el caso que la imagen venga desde el webservice y ya la hayas seteado en la clase asincrona.
        //viewHolder.imagen.setImageResource(dataModel.getImagen());
        return convertView;
    }
}

Один из самых важных методов getView, этот метод назван каждой статьей, которая создается в твоем списке, здесь ты ищешь статьи внутри твоего layout, даешь формат и вручать данные.

После получаешь твои данные об асинхронном способе, как это делаешь ты, ты должен создавать с этим результатом список объектов, принадлежащих твоему классу Model который мы создаем.

Заменять List<String> preguntas = new ArrayList<String>(); из-за

ArrayList<Modelo> preguntas = new ArrayList<Modelo>();
//Parsea la respuesta obtenida por el Asynctask
JSONArray jsonArray = null;
try {
    jsonArray = new JSONArray(result);
} catch (JSONException e) {
    e.printStackTrace();
}
for (int i=0; i<jsonArray.length(); i++) {
    JSONObject preguntaDatos = null;
    try {
        preguntaDatos = jsonArray.getJSONObject(i);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    String pregunta = null;
    try {
        Modelo pregunta = new Modelo();
        pregunta.txt = preguntaDatos.getString("pregunta");
        //pregunta.img = preguntaDatos.getString("imagen");
        //En el caso que no fuese la imagen la que vuelve por el webservice puedes dar las imagenes que estimes conveniente
    } catch (JSONException e) {
        e.printStackTrace();
    }
    preguntas.add(pregunta);
}
adapter = new CustomAdapter(preguntas,getApplicationContext());
//Asignas el Adapter a tu ListView para mostrar los datos.
mostrarr.setAdapter(adapter);
mostrarr.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        Modelo pregunta = preguntas.get(position);

        System.out.println("Haz hecho click en "+pregunta.getTxt());
    }
});

В этом примере я дал ему назначенное по умолчанию изображение твоей статье, которая @android:drawable/ic_dialog_info, но также прокомментированный акцент, поскольку он должен бы быть в случае, в котором это было изображение с webservice.

3
ответ дан 03.12.2019, 17:59

Есть несколько вопросов с чем-то сходным с тем, что ты желаешь, в этом случае иметь персонализированный вид, у которого был бы значок и текст, для этого ты можешь создавать layout layout с элементами, которые ты желаешь, например:

item.xml :

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:background="#000000"
    android:orientation="horizontal" >
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:src="@drawable/foca" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/text1"
        android:text="Rehabilitate Sick and Injured Seal Pups\World Oceans Week\n$1 means 1 pound of fish for a  hungry seal pup"
        android:textStyle="bold"
        android:textColor="#879BA6"
        android:background="#000000"
        android:textColorHighlight="#000000"
        android:paddingLeft="20dp"
        android:textIsSelectable="true" />
</LinearLayout>

Который произвел бы вид, который содержит изображение (значок) и текст:

introducir la descripción de la imagen aquí

и этот вид будет надут посредством твоего adapter, настроенного внутри метода getView (),

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

Списки И Адаптеры В Android

introducir la descripción de la imagen aquí

и другой, названный, Как создавать adapter, настроенный в Android

1
ответ дан 03.12.2019, 17:59

Теги

Похожие вопросы