我正在使用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();
}