自定义Adapter的getView方法不执行

Duke__ 2014-02-26 06:26:50
getCount()有数据. 自定义的Adapter不显示数据.Log了一下.getView()方法没执行到.布局方面应没什么问题
会不会是我handler的写法有问题?
贴代码看看
package com.naxieshu.activity;

import java.util.List;
import java.util.Map;

import com.naxieshu.domain.Book;
import com.naxieshu.service.NaxieshuService;
import com.naxieshu.service.impl.NaxieshuServiceImpl;
import com.naxieshu.util.ImageUtil;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class FindActivity extends Activity implements OnClickListener{
protected static final String TAG = "FindActivity";
/**搜索按钮*/
Button searchBtn;
/**搜索输入框*/
TextView searchText;
/**搜索结果列表*/
ListView listView;
/**创建业务层实例*/
NaxieshuService service = new NaxieshuServiceImpl(this);

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

searchBtn = (Button)findViewById(R.id.search_btn);
searchText = (TextView)findViewById(R.id.search_text);
listView = (ListView)findViewById(R.id.search_books);
searchBtn.setOnClickListener(this);
}

Handler handler = new Handler() {
public void handleMessage(Message msg) {
if(msg.what == R.id.search_btn){
MyListAdapter myListAdapter = (MyListAdapter) msg.obj;
/**为listView绑定自定义控制*/
listView.setAdapter(myListAdapter);
}
};
};

/**点击事件处理*/
public void onClick(View v) {
switch (v.getId()) {
case R.id.search_btn:
//因为数据源与MyListAdapter中涉及网络连接.所以开个子线程
new Thread(){
public void run() {
String value = searchText.getText().toString();
List<Map<String,Book>> list = service.findBookByNameOrWriter(value);
/**实例自定义控件*/
SimpleAdapter myListAdapter = new MyListAdapter(FindActivity.this,list);
Message msg = new Message();
msg.what = R.id.search_btn;
msg.obj = myListAdapter;
handler.sendMessage(msg);
};
}.start();
break;
}
}

/**自定义List内容控制*/
class MyListAdapter extends SimpleAdapter{
public Context context;
public List<? extends Map<String, ?>> data;

public MyListAdapter(Context context,
List<? extends Map<String, ?>> data) {
super(context, data, 0, null, null);
this.context = context;
this.data = data;
}

/**
* 在创建View资源对象的时候提供效率的缓存策略
*/
class ViewHold{
//book.cover
public ImageView image;
//book.title book.shortIntro
public TextView namtView,introView,nullView;
}
ViewHold hold =null;

@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i(TAG, "DDD");
//判断是否第一次执行convertView,如果是第一次就进行布局资源的创建操作
if (convertView == null){
hold = new ViewHold();
//填充加载布局资源
convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.activity_find_listview, null);
hold.image = (ImageView)convertView.findViewById(R.id.bookImage);
hold.namtView = (TextView)convertView.findViewById(R.id.bookName);
hold.introView = (TextView)convertView.findViewById(R.id.bookShortIntro);
hold.nullView = (TextView)convertView.findViewById(R.id.booknull);
//保存标记
convertView.setTag(hold);
} else {
hold = (ViewHold) convertView.getTag();
}
//获取数据,进行数据填充
Book book = (Book) data.get(position).get("book");
Bitmap bitmap = ImageUtil.getImageBitmap(book.getCover());
hold.image.setImageBitmap(bitmap);
hold.namtView.setText(book.getTitle());
hold.introView.setText(book.getShortIntro());
return convertView;
}

@Override
public int getCount() {
Log.i(TAG, "getCount:"+this.data.size());
return this.data.size();
}

@Override
public Object getItem(int position) {
return super.getItem(position);
}

@Override
public long getItemId(int position) {
return super.getItemId(position);
}
}
}
...全文
2886 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Big_szyang 2015-11-02
  • 打赏
  • 举报
回复
handler 中设空,更新一次,然后再runable中设cursor,再次更新。 private Cursor getCursor() { Cursor cursor = null; ThreadPool.execute(new Runnable() { @Override public void run() { try { mDbAdapter = MapStart.getInstance().mDataBaseOper; mCursor = mDbAdapter.queryAll(mDbAdapter.TABLE_GPS_ALARM, null, null,null, null, null,null, null); if(mCursor == null){ return; } else if(mCursor.getCount() <= 0){ return; } if(false == mAdapter.setAlarmRecordList(mCursor)){ return; } if(mCursor.moveToFirst()){ mAdapter.setCursor(mCursor); mAdapter.notifyDataSetChanged(); } }catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); return cursor; } class MyHandler extends Handler { public void handleMessage(Message msg) { switch (msg.what) { case 1: mAdapter.setCursor(null);//此处setcursor并notifyDataSetChanged后,在getcursor()中才能够更新? mAdapter.notifyDataSetChanged(); getCursor(); break; default: break; } }; };
嗨嗨明明 2015-01-03
  • 打赏
  • 举报
回复
可能是你把listview设置成gone了把。因为异步加载有几个状态:比如1.加载中》》》2.进度条》》》》2.notifyDataSetChanged然后显示成功
小敏爱点滴 2014-09-25
  • 打赏
  • 举报
回复
楼主有没有解决这个问题哈,同求答案哈.
小敏爱点滴 2014-09-25
  • 打赏
  • 举报
回复
楼走有没有解决这个问题哈,求答案哈.
gtchjc 2014-08-02
  • 打赏
  • 举报
回复
可以看看这个 http://bbs.csdn.net/topics/390849529?page=1#post-397901795 http://www.apkbus.com/android-176569-1-1.html
Duke__ 2014-02-26
  • 打赏
  • 举报
回复
引用 2 楼 ncepu307 的回复:
楼主看下是不是没有运行handleMessage()函数?
Message msg = new Message();
这句话改成:
Message msg = Message.obtain();
应是布局的问题了.. handleMessage里打印listView的行数是有数据的..页面就不显示
Duke__ 2014-02-26
  • 打赏
  • 举报
回复
我又作了个修改.是线程问题.现在getView()执行了.但是只被调用一次..但getCount是有多条记录的
package com.naxieshu.activity;

import java.util.List;
import java.util.Map;

import com.naxieshu.domain.Book;
import com.naxieshu.service.NaxieshuService;
import com.naxieshu.service.impl.NaxieshuServiceImpl;
import com.naxieshu.util.ImageUtil;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class FindActivity extends Activity implements OnClickListener{
	protected static final String TAG = "FindActivity";
	/**搜索按钮*/
	Button searchBtn;
	/**搜索输入框*/
	TextView searchText;
	/**搜索结果列表*/
	ListView listView;
	/**创建业务层实例*/
	NaxieshuService service = new NaxieshuServiceImpl(this);
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_find);
		searchBtn = (Button)findViewById(R.id.search_btn);
		searchText = (TextView)findViewById(R.id.search_text);
		listView = (ListView)findViewById(R.id.search_books);
		
		/**绑定点击事件*/
		searchBtn.setOnClickListener(this);
	}
	
	Handler handler = new Handler() {
		public void handleMessage(Message msg) {
			if(msg.what == R.id.search_btn){
				List<Map<String,Book>> list = (List<Map<String, Book>>) msg.obj;
				/**实例自定义控件*/
				SimpleAdapter myListAdapter = new MyListAdapter(FindActivity.this,list);
				/**为listView绑定自定义控制*/
				listView.setAdapter(myListAdapter);
			}
		};
	};
	
	/**点击事件处理*/
	public void onClick(View v) {
		switch (v.getId()) {
			case R.id.search_btn:
			//因为数据源与MyListAdapter中涉及网络连接.所以开个子线程
			new Thread(){
				public void run() {
					String value = searchText.getText().toString();
					List<Map<String,Book>> list = service.findBookByNameOrWriter(value);
					Message msg = new Message();
					msg.what = R.id.search_btn;
					msg.obj = list;
					handler.sendMessage(msg);
				};
			}.start();
			break;
		}
	}
	
	/**自定义List内容控制*/
	class MyListAdapter extends SimpleAdapter{
		public Context context;
		public List<? extends Map<String, ?>> data;
		
		public MyListAdapter(Context context,
				List<? extends Map<String, ?>> data) {
			super(context, data, 0, null, null);
			this.context = context;
			this.data = data;
		}
		
		/**
		 * 在创建View资源对象的时候提供效率的缓存策略
		 */
		class ViewHold{
			//book.cover
			public ImageView image;
			//book.title book.shortIntro
			public TextView namtView,introView;
		}
		ViewHold hold =null;
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			Log.i(TAG, "getView()---");
			//判断是否第一次执行convertView,如果是第一次就进行布局资源的创建操作
			if (convertView == null){
				hold = new ViewHold();
				//填充加载布局资源
				convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.activity_find_listview, null);
				hold.image = (ImageView)convertView.findViewById(R.id.bookImage);
				hold.namtView = (TextView)convertView.findViewById(R.id.bookName);
				hold.introView = (TextView)convertView.findViewById(R.id.bookShortIntro);
				//保存标记
				Log.i(TAG, "getView()=====");
				convertView.setTag(hold);
			} else {
				Log.i(TAG, "getView()+++++");
				hold = (ViewHold) convertView.getTag();
			}
			//获取数据,进行数据填充
			Book book = (Book) data.get(position).get("book");
			Bitmap bitmap = ImageUtil.getImageBitmap(book.getCover());
			hold.image.setImageBitmap(bitmap);
			hold.namtView.setText(book.getTitle());
			Log.i(TAG, hold.namtView.getText().toString());
			hold.introView.setText(book.getShortIntro());
			return convertView;
		}

		@Override
		public int getCount() {
			Log.i(TAG,"getCount:"+this.data.size());
			return this.data.size();
		}

		@Override
		public Object getItem(int position) {
			Log.i(TAG, "getItem():"+getItem(position).toString());
			return super.getItem(position);
		}

		@Override
		public long getItemId(int position) {
			Log.i(TAG, "getIemId()"+getItemId(position));
			return super.getItemId(position);
		}
	}
}
Duke__ 2014-02-26
  • 打赏
  • 举报
回复
引用 2 楼 ncepu307 的回复:
楼主看下是不是没有运行handleMessage()函数?
Message msg = new Message();
这句话改成:
Message msg = Message.obtain();
handleMessage有运行.
依然绿茶 2014-02-26
  • 打赏
  • 举报
回复
楼主看下是不是没有运行handleMessage()函数?
Message msg = new Message();
这句话改成:
Message msg = Message.obtain();
Duke__ 2014-02-26
  • 打赏
  • 举报
回复
会不会因为我在子线程里实例化MyListAdapter的问题?

80,351

社区成员

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

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