我正在使用android studio,并且ListView有一些问题。

列表视图显示正确的行数,但是每行重复元素,而不显示ArrayList的每个元素。

MainActivity的XML:

<RelativeLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/linBotoes"
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:layout_alignParentBottom="true"
        android:layout_alignRight="@+id/linBotoes" >

        <Button
            android:id="@+id/btnProcurar"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="0.33"
            android:text="Busca" />

        <Button
            android:id="@+id/btnNovo"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="0.33"
            android:text="Nova" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="Alterar"
            android:id="@+id/btnAlterar" />

        <Button
            android:id="@+id/btnExcluir"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="0.33"
            android:text="Apagar" />

    </LinearLayout>

    <ListView android:id="@+id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_above="@+id/linBotoes"/>

</RelativeLayout>


这些行的元素的XML:

<RelativeLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.eduardo.voiceblog_beta.LsPostagem">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/txtTitulo"
            android:text="TESTE"
            android:textColor="#ffff6a0f" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/txtData"
            android:text="data"
            android:textColor="#ffff6a0f"
            android:layout_alignParentRight="true" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imgPostagem"
            android:layout_below="@+id/txtTitulo"
            android:maxHeight="200dp"
            android:maxWidth="200dp"
            android:adjustViewBounds="true"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/txtPostagem"
            android:text="comentario"
            android:textColor="#ffff6a0f"
            android:layout_below="@+id/imgPostagem"/>
    </LinearLayout>

</RelativeLayout>


MainActivity中的代码:

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

        postagemDAO = new PostagemDAO(this);
        postagemDAO.abrir();

        ListView lsView;
        lsView = (ListView) findViewById(R.id.list);
        PostagemAdapter adaptador = new PostagemAdapter(MainActivity.this, R.layout.activity_ls_postagem,/*minhaPostagem*/postagemDAO.listarPostagem());
        lsView.setAdapter(adaptador);
    }


适配器代码:

package com.example.eduardo.voiceblog_beta;

import android.content.Context;

import android.view.View;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.ArrayList;

import BD.Postagem;

/**
 * Created by eduardo on 19/05/15.
 */
public class PostagemAdapter extends ArrayAdapter<Postagem>{

    ArrayList<Postagem> arrayPostagem = new ArrayList<Postagem>();

    public PostagemAdapter(Context context, int it ,ArrayList<Postagem> postagemAtual) {
        super(context, it,postagemAtual);
        this.arrayPostagem.addAll(postagemAtual);
    }

    @Override
    public int getCount() {
        return arrayPostagem.size();
    }


    @Override
    public long getItemId(int position) {
        return position;
    }

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

        Postagem postagem = getItem(position);

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.activity_ls_postagem, parent,false);
        }

        //ImageView imageView = (ImageView) itemView.findViewById(R.id.imgPostagem);
        //imageView.setImageURI(Uri.parse(postagemAtual.getCaminhoFoto()));

        TextView txtTitulo = (TextView) convertView.findViewById(R.id.txtTitulo);
        txtTitulo.setText(postagem.getTituloPostagem());

        TextView txtData = (TextView) convertView.findViewById(R.id.txtData);
        txtData.setText(postagem.getDataPostagem());

        TextView txtComentario = (TextView) convertView.findViewById(R.id.txtPostagem);
        txtComentario.setText(postagem.getComentarioPostagem());

        return convertView;
    }
}


使用listarPostagem方法的DAO:

public ArrayList<Postagem> listarPostagem () {
        ArrayList<Postagem> postagem = new ArrayList<Postagem>();

        String[] colunas = new String[] { "DATA_POSTAGEM", "TITULO_POSTAGEM", "COMENTARIO_POSTAGEM", "FOTO_POSTAGEM"};

        Cursor cursor = bd.query("TB_POSTAGEM",colunas , null, null, null, null, null);

        Postagem post = new Postagem();

        cursor.moveToFirst();

        while (!cursor.isAfterLast()) {
            post.setTituloPostagem(cursor.getString(cursor.getColumnIndex("TITULO_POSTAGEM")));
            post.setDataPostagem(cursor.getString(cursor.getColumnIndex("DATA_POSTAGEM")));
            post.setComentarioPostagem(cursor.getString(cursor.getColumnIndex("COMENTARIO_POSTAGEM")));
            post.setCaminhoFoto(cursor.getString(cursor.getColumnIndex("FOTO_POSTAGEM")));
            postagem.add(post);
            cursor.moveToNext();
        }
        // make sure to close the cursor
        cursor.close();
        return postagem;
    }


已经感谢您的帮助。

最佳答案

看起来问题在于您仅使用一个Postagem引用,因此,每次在游标中循环时,都将修改列表中的每个条目。

尝试将调用移至循环内的Postagem post = new Postagem();,以便为列表中的每个项目创建一个新的Postagem引用。

    //Postagem post = new Postagem();

    cursor.moveToFirst();

    while (!cursor.isAfterLast()) {

        Postagem post = new Postagem(); //add this here

        post.setTituloPostagem(cursor.getString(cursor.getColumnIndex("TITULO_POSTAGEM")));
        post.setDataPostagem(cursor.getString(cursor.getColumnIndex("DATA_POSTAGEM")));
        post.setComentarioPostagem(cursor.getString(cursor.getColumnIndex("COMENTARIO_POSTAGEM")));
        post.setCaminhoFoto(cursor.getString(cursor.getColumnIndex("FOTO_POSTAGEM")));
        postagem.add(post);
        cursor.moveToNext();
    }

10-08 03:16