自定义ArrayAdapter初始化时不能显示,加新数据时重复显示所有

zzytn 2014-04-14 07:57:52
HI,各位安卓研发高级工程师,请教问题如下

仿网上自定义写了一个ArrayAdapter,如下:

mport java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import cn.com.ccxe.bean.Article;
import cn.com.ccxe.bean.ComplexMessage;
import cn.com.ccxe.message.R;
import cn.com.ccxe.util.AsyncImageLoaderTask;

public class MessageArrayAdapter extends ArrayAdapter<ComplexMessage> {

private int resourceId;
Context mContext;
LayoutInflater mLayoutInflater;


public MessageArrayAdapter(Context context, int textViewResourceId,List<ComplexMessage> cms) {
super(context, textViewResourceId,cms);
this.resourceId = textViewResourceId;
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
}

@Override
public View getView(int position, View convertView, ViewGroup parent){
ComplexMessage cm = getItem(position);

View view;
if (convertView == null) {
view = mLayoutInflater.inflate(resourceId, parent, false);
} else {
view = convertView;
}

LinearLayout linearLayout = (LinearLayout) view.findViewById(R.id.messageArrayAdapterLinerlayout);
Article[] arts = cm.getNews().getArticles();
if(arts != null && arts.length == 1){
//如果只有一条消息
}else{
//如果有多条消息
for(int i=0;i<arts.length;i++){
if(i ==0){
Article art = arts[i];
FrameLayout frameLayout = new FrameLayout(mContext);
FrameLayout.LayoutParams frameLayoutParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT,FrameLayout.LayoutParams.WRAP_CONTENT);
frameLayoutParams.leftMargin=20;
frameLayoutParams.rightMargin = 20;
frameLayout.setLayoutParams(frameLayoutParams);
ImageView iv = new ImageView(mContext);
android.view.ViewGroup.LayoutParams ivLayoutParams = new android.view.ViewGroup.LayoutParams(linearLayout.getWidth(),linearLayout.getWidth()/2);
iv.setLayoutParams(ivLayoutParams);
iv.setTag(art.getPicurl());
new AsyncImageLoaderTask().execute(art.getPicurl(),iv);
TextView tv = new TextView (mContext);
android.view.ViewGroup.LayoutParams tvLayoutParams = new android.view.ViewGroup.LayoutParams(linearLayout.getWidth(),linearLayout.getWidth()/4);
tv.setLayoutParams(tvLayoutParams);
tv.setText(art.getTitle());
frameLayout.addView(iv);
frameLayout.addView(tv);
linearLayout.addView(frameLayout);
}else{
}
}
}
return view;
}

}



那么,在Activity中调用如下:


DatabaseHelper dbHelper = DBUtil.getDatabaseHelper(MainActivity.this);
Cursor c =null;
try{
SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();
c = sqliteDatabase.rawQuery("SELECT * FROM message ORDER BY _id DESC limit 0,10 ", new String[]{});
while (c.moveToNext()) {
int _id = c.getInt(c.getColumnIndex("_id"));
idMax=idMax>_id?idMax:_id;
idMin=idMin>_id?_id:idMin;
String message = c.getString(c.getColumnIndex("message"));
Gson g=new Gson();
ComplexMessage cm=g.fromJson(message,new TypeToken<ComplexMessage>(){}.getType());
mListItems.add(cm);
}


}catch(Exception e){
Log.e(MainActivity.class.toString(), e.toString());
}finally{
if(c != null){
c.close();
}
}

mAdapter = new MessageArrayAdapter(this, R.layout.list_view1_item, mListItems);
// You can also just use setListAdapter(mAdapter)
actualListView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
mPullRefreshListView.getRefreshableView().setSelection(mAdapter.getCount()-1);



发现打开应用时,即使有数据都不显示。
该MainActivity实现了OnScrollListener,做了一个异步线程,当手指划动时加载数据却可以显示出来,但每加载一次却是显示所有的数据,并不是仅显示新增加的内容


private class GetDataTask extends AsyncTask<Void, Void, String[]> {

@Override
protected String[] doInBackground(Void... params) {

return null;
}

@Override
protected void onPostExecute(String[] result) {
DatabaseHelper dbHelper = DBUtil.getDatabaseHelper(MainActivity.this);
SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();
Cursor c = sqliteDatabase.rawQuery("select * from message where _id < ? order by _id desc limit 0,10 ", new String[]{idMin+""});
int count = c.getCount();
try{
if(c.getCount() > 0){
while (c.moveToNext()) {
int _id = c.getInt(c.getColumnIndex("_id"));
idMax=idMax>_id?idMax:_id;
idMin=idMin>_id?_id:idMin;
String message = c.getString(c.getColumnIndex("message"));
Gson g=new Gson();
ComplexMessage cm=g.fromJson(message,new TypeToken<ComplexMessage>(){}.getType());
mListItems.addFirst(cm);
}

}
}catch(Exception e){
Log.e(MainActivity.class.toString(), e.toString());
}finally{
c.close();
}
mAdapter.notifyDataSetChanged();
// // Call onRefreshComplete when the list has been refreshed.
mPullRefreshListView.onRefreshComplete();
mPullRefreshListView.getRefreshableView().setSelection(count-1);
super.onPostExecute(result);
}
}



请各位指点,找了一天不知道问题在哪儿。


...全文
233 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzytn 2014-04-15
  • 打赏
  • 举报
回复
mAdapter.notifyDataSetChanged(); 代码中都跟了这个方法啊
lxwwd 2014-04-15
  • 打赏
  • 举报
回复
4楼正解,添加你的适配器data列表后,用notifyDataSetChanged,实现局部刷新
wangsitao 2014-04-15
  • 打赏
  • 举报
回复
局部刷新用notifyDataSetChanged
zzytn 2014-04-15
  • 打赏
  • 举报
回复
有没有高手上来指点一下,在线等。
zzytn 2014-04-14
  • 打赏
  • 举报
回复
最关键的是,点击刷新时,为何总是会重复刷新所有数据呢?
zzytn 2014-04-14
  • 打赏
  • 举报
回复
看到有网友说在主线程里面不能有网络操作或数据库操作,于是在Activity中将从数据库获取数据的那几行代码改成初始化的几个DEMO数据,发现这样可以显示了。 那么想直接点打开就可以显示数据库中的数据应该如何操作呢?也用异步方法吗?

80,359

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧