一个诡异的anroid中listView适配器问题

lxq_xsyu
博客专家认证
2013-09-13 03:32:17
我ListView用的是BaseAdapter适配器,ListView代码如下:

<ListView
android:id="@+id/validate01_rule1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fastScrollEnabled="true"/>


在BaseAdapter中大概有200多行数据,每个getView中是一个LinearLayout,在LinearLayout中是四个TextView,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_cell01"
android:layout_width="60dip"
android:layout_height="30dip"
android:gravity="center"
android:height="30dip"
android:textColor="#505050"
android:background="#ffffff"/>
<TextView
android:id="@+id/validate01_tv_cell02"
android:layout_width="0dip"
android:layout_marginLeft="1dip"
android:layout_height="30dip"
android:layout_weight="1"
android:gravity="center"
android:singleLine="true"
android:textColor="#505050"
android:background="#ffffff"
android:drawableRight="@drawable/arrow_drop"/>
<TextView
android:id="@+id/validate01_tv_cell03"
android:layout_width="0dip"
android:layout_marginLeft="1dip"
android:layout_height="30dip"
android:layout_weight="1"
android:gravity="center"
android:singleLine="true"
android:textColor="#505050"
android:background="#ffffff"
android:drawableRight="@drawable/arrow_drop"/>
<TextView
android:id="@+id/tv_cell04"
android:layout_width="60dip"
android:layout_marginLeft="1dip"
android:layout_height="30dip"
android:gravity="center"
android:textColor="#505050"
android:background="#ffffff"/>
</LinearLayout>

现在getCount方法能得到数据,是200,但是getView方法不执行,这是怎么回事呢?
...全文
575 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxq_xsyu 2013-09-24
  • 打赏
  • 举报
回复
呵呵,我问题都解决了,谢谢各位
lxq_xsyu 2013-09-22
  • 打赏
  • 举报
回复
引用
@Override public View getView(int position, View convertView, ViewGroup parent) { // 获取填充对象 if(convertView == null){ convertView = mInflater.inflate(R.layout.validate01_cell, parent, false); } TextView cellView1 = (TextView) convertView .findViewById(R.id.tv_cell01); TextView cellView2 = (TextView) convertView .findViewById(R.id.validate01_tv_cell02); TextView cellView3 = (TextView) convertView .findViewById(R.id.validate01_tv_cell03); TextView cellView4 = (TextView) convertView .findViewById(R.id.tv_cell04); String[] cell = datas[position]; if ("1".equals(cell[3])) { cellView2.setBackgroundColor(Color.rgb(120, 169, 214)); } if ("1".equals(cell[4])) { cellView3.setBackgroundColor(Color.rgb(120, 169, 214)); } // 设置文本内容 cellView1.setText(cell[0]); cellView2.setText(cell[1] + "#" + cell[0] + "#" + formatValue(Util.formatLotterNo(cell[5]) + "")); cellView3.setText(cell[2] + "#" + cell[0] + "#" + formatValue(Util.formatLotterNo(cell[5]) + "")); cellView4.setText(cell[5]); cellView2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { TextView tv = (TextView) v; String text = tv.getText().toString(); String t[] = text.split("#"); String result = dao.getAllDataByNoQs(t[1], type[0]); String[] res = result.split("\\|"); int[] len = new int[res.length]; int[] index = new int[res.length]; for (int j = 0; j < res.length; j++) { len[j] = res[j].split(",").length; int sb = res[j].indexOf(t[2]); if (sb != -1) { index[j] = res[j].substring(0, sb).split(",").length; } else { index[j] = -1; } } String[] results = new String[res.length * 2]; for (int i = 1; i < results.length; i = i + 2) { results[i] = res[(i - 1) / 2]; } switch (res.length) { case 3: if (index[2] == -1) { results[4] = "豹子号[" + len[2] + "]"; } else { results[4] = "豹子号[" + len[2] + "] 位置" + (index[2] + 1); } case 2: if (index[1] == -1) { results[2] = "组三[" + len[1] + "]"; } else { results[2] = "组三[" + len[1] + "] 位置" + (index[1] + 1); } case 1: if (index[0] == -1) { results[0] = "组六[" + len[0] + "]"; } else { results[0] = "组六[" + len[0] + "] 位置" + (index[0] + 1); } } PopupListAdapter popupAdapter = new PopupListAdapter(context, results, t[2]); popupList.setAdapter(popupAdapter); popup.showAsDropDown(v); popup.showAtLocation(v, Gravity.CENTER, Util.dip2px(context, 60), 0); } }); cellView3.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { TextView tv = (TextView) v; String text = tv.getText().toString(); String t[] = text.split("#"); String result = dao.getAllDataByNoQs(t[1], type[1]); String[] res = result.split("\\|"); int[] len = new int[res.length]; int[] index = new int[res.length]; for (int j = 0; j < res.length; j++) { len[j] = res[j].split(",").length; int sb = res[j].indexOf(t[2]); if (sb != -1) { index[j] = res[j].substring(0, sb).split(",").length; } else { index[j] = -1; } } String[] results = new String[res.length * 2]; for (int i = 1; i < results.length; i = i + 2) { results[i] = res[(i - 1) / 2]; } switch (res.length) { case 3: if (index[2] == -1) { results[4] = "豹子号[" + len[2] + "]"; } else { results[4] = "豹子号[" + len[2] + "] 位置" + (index[2] + 1); } case 2: if (index[1] == -1) { results[2] = "组三[" + len[1] + "]"; } else { results[2] = "组三[" + len[1] + "] 位置" + (index[1] + 1); } case 1: if (index[0] == -1) { results[0] = "组六[" + len[0] + "]"; } else { results[0] = "组六[" + len[0] + "] 位置" + (index[0] + 1); } } PopupListAdapter popupAdapter = new PopupListAdapter(context, results, t[2]); popupList.setAdapter(popupAdapter); popup.showAsDropDown(v); popup.showAtLocation(v, Gravity.CENTER, Util.dip2px(context, 60), 0); } }); return convertView; }
这样改也不行啊,可能不是这个问题,我前面这样写过?
lxq_xsyu 2013-09-22
  • 打赏
  • 举报
回复
引用 11 楼 zhuangyiyou 的回复:
把 popupview = mInflater.inflate(R.layout.validate_popupwindow, null);换成 popupview = mInflater.inflate(R.layout.validate_popupwindow, parent,false);
能不能解释一下parent和false这两个参数的作用,谢谢!
lxq_xsyu 2013-09-22
  • 打赏
  • 举报
回复
引用 10 楼 wael1234 的回复:
 convertView = mInflater.inflate(R.layout.validate01_cell, null);这里啊~ convertView是移出屏幕的View对象,你一开始加载时没有移出屏幕的View对象,这里肯定是null,你返回出去也没用啊 你要用View类去创建啊,不能用convertView
请问我每次都 convertView = mInflater.inflate(R.layout.validate01_cell, null)是获取到了对象啊,convertView不可能为null,返回的怎么会是null呢?
lxq_xsyu 2013-09-22
  • 打赏
  • 举报
回复
在GridView布局中各个格子的元素不同,如下图:

在使用BaseAdapter时,怎么进行优化?滑动时怎么保证内存不泄露?
如果使用下面这种方式好像不行:

if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text,
null);
holder = new ViewHolder();
holder.text1 = (TextView) convertView.findViewById(R.id.text1);
holder.icon2 = (ImageView) convertView.findViewById(R.id.icon2);
convertView.setTag(holder);
}
else{
holder = (ViewHolder)convertView.getTag();
}

有没有人遇到过这个问题,麻烦解决一下
简单随心 2013-09-22
  • 打赏
  • 举报
回复
 @Override
    public Object getItem(int pos) {
        // TODO Auto-generated method stub
        return null;
    }
改成
 @Override
    public Object getItem(int pos) {
        return datas[pos];
    }
leehong2005 2013-09-20
  • 打赏
  • 举报
回复
你getview中每判断一下convertView是不是为null,可以复用view,你这样效率很低。 还有,你的代码你就不能封装一下,一团乱麻。一看就是新手写的。
zhuangyiyou 2013-09-18
  • 打赏
  • 举报
回复
把 popupview = mInflater.inflate(R.layout.validate_popupwindow, null);换成 popupview = mInflater.inflate(R.layout.validate_popupwindow, parent,false);
wael1234 2013-09-18
  • 打赏
  • 举报
回复
 convertView = mInflater.inflate(R.layout.validate01_cell, null);这里啊~ convertView是移出屏幕的View对象,你一开始加载时没有移出屏幕的View对象,这里肯定是null,你返回出去也没用啊 你要用View类去创建啊,不能用convertView
lxq_xsyu 2013-09-18
  • 打赏
  • 举报
回复
适配器代码已贴出来,哪位大神知道问题所在
lxq_xsyu 2013-09-18
  • 打赏
  • 举报
回复



import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.meritit.lottery.R;
import com.meritit.lottery.dao.BaseDao;
import com.meritit.lottery.util.Util;
/**
 * 数据列表适配器
 * @author
 *
 */
public class ValidateListAdapter extends BaseAdapter{
	private LayoutInflater mInflater;      //界面载入器
	private String[][] datas;     //所有的历史区域数据                   //历史区域数量
	private Context context;
	private View popupview;
	public static PopupWindow popup;
	private ListView popupList;
	private String[] type;
	private BaseDao dao;
	
	/**
	 * 适配器的构造器
	 * @param context 上下文
	 * @param datas   数据
	 */
	public ValidateListAdapter(Context context, String[][] datas, String[] type, BaseDao dao){
		System.out.println("我进适配器了");
		this.datas = datas;
		System.out.println("适配器里面的datas.length = " + datas.length);
		this.context = context;
		this.type = type;
		this.dao = dao;
		mInflater = LayoutInflater.from(context);  //载入界面
		init();
	}
	
	public void init(){
		popupview = mInflater.inflate(R.layout.validate_popupwindow, null);
		popupList = (ListView) popupview.findViewById(R.id.popup_list);
		popup = new PopupWindow(popupview, Util.dip2px(context, 200),
				Util.dip2px(context, 240));
	}
	 
	@Override
	public int getCount() {
		System.out.println("getCount方法 = " + datas.length);
		return datas.length;
	}

	@Override
	public Object getItem(int pos) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public long getItemId(int pos) {
		// TODO Auto-generated method stub
		return pos;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		
		System.out.println("我进到了适配器中的getView方法");
        //获取填充对象
 	    convertView = mInflater.inflate(R.layout.validate01_cell, null);      
 	    TextView cellView1 = (TextView) convertView.findViewById(R.id.tv_cell01);   
 	    TextView cellView2 = (TextView) convertView.findViewById(R.id.validate01_tv_cell02);
 	    TextView cellView3 = (TextView) convertView.findViewById(R.id.validate01_tv_cell03);
 	    TextView cellView4 = (TextView) convertView.findViewById(R.id.tv_cell04); 
 	    String[] cell =  datas[position];
 	    System.out.println("适配器里的cell = " + cell);
 	    if("1".equals(cell[3])){
 	    	cellView2.setBackgroundColor(Color.rgb(120, 169, 214));
 	    }
 	    if("1".equals(cell[4])){
 	    	cellView3.setBackgroundColor(Color.rgb(120, 169, 214));
 	    }
		//设置文本内容
    	cellView1.setText(cell[0]);
    	cellView2.setText(cell[1]+"#"+cell[0]+"#"+formatValue(Util.formatLotterNo(cell[5])+""));
    	cellView3.setText(cell[2]+"#"+cell[0]+"#"+formatValue(Util.formatLotterNo(cell[5])+""));
    	cellView4.setText(cell[5]);
    	
 	    cellView2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				TextView tv = (TextView) v;
				String text = tv.getText().toString();
				String t[] = text.split("#");
				String result = dao.getAllDataByNoQs(t[1], type[0]);
				String[] res = result.split("\\|");
				int[] len = new int[res.length];
				int[] index = new int[res.length];
				for(int j=0; j<res.length; j++){
					len[j] = res[j].split(",").length;
					int sb = res[j].indexOf(t[2]);
					if(sb != -1){
						index[j] = res[j].substring(0, sb).split(",").length;
					}else{
						index[j] = -1;
					}
				}
				String[] results = new String[res.length * 2];
				for(int i=1; i<results.length; i=i+2){
					results[i] = res[(i-1)/2];
				}
				switch(res.length){
				case 3:
					if(index[2] == -1){
						results[4] = "豹子号["+len[2]+"]";
					}else{
						results[4] = "豹子号["+len[2]+"]  位置"+(index[2] + 1);
					}
				case 2:
					if(index[1] == -1){
						results[2] = "组三["+len[1]+"]";
					}else{
						results[2] = "组三["+len[1]+"]  位置" +(index[1] + 1);
					}	
				case 1:
					if(index[0] == -1){
						results[0] = "组六["+len[0]+"]";
					}else{
						results[0] = "组六["+len[0]+"]  位置" +(index[0] + 1);
					}
					
				}
				
				PopupListAdapter popupAdapter =new PopupListAdapter(context, results, t[2]);
				popupList.setAdapter(popupAdapter);
				popup.showAsDropDown(v);
				popup.showAtLocation(v, Gravity.CENTER, Util.dip2px(context, 60), 0);
			}
		});
 	    
 	    cellView3.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				TextView tv = (TextView) v;
				String text = tv.getText().toString();
				String t[] = text.split("#");
				String result = dao.getAllDataByNoQs(t[1], type[1]);
				String[] res = result.split("\\|");
				int[] len = new int[res.length];
				int[] index = new int[res.length];
				for(int j=0; j<res.length; j++){
					len[j] = res[j].split(",").length;
					int sb = res[j].indexOf(t[2]);
					if(sb != -1){
						index[j] = res[j].substring(0, sb).split(",").length;
					}else{
						index[j] = -1;
					}
				}
				String[] results = new String[res.length * 2];
				for(int i=1; i<results.length; i=i+2){
					results[i] = res[(i-1)/2];
				}
				switch(res.length){
				case 3:
					if(index[2] == -1){
						results[4] = "豹子号["+len[2]+"]";
					}else{
						results[4] = "豹子号["+len[2]+"]  位置"+(index[2] + 1);
					}
				case 2:
					if(index[1] == -1){
						results[2] = "组三["+len[1]+"]";
					}else{
						results[2] = "组三["+len[1]+"]  位置" +(index[1] + 1);
					}	
				case 1:
					if(index[0] == -1){
						results[0] = "组六["+len[0]+"]";
					}else{
						results[0] = "组六["+len[0]+"]  位置" +(index[0] + 1);
					}
					
				}				
				PopupListAdapter popupAdapter =new PopupListAdapter(context, results, t[2]);
				popupList.setAdapter(popupAdapter);
				popup.showAsDropDown(v);
				popup.showAtLocation(v, Gravity.CENTER, Util.dip2px(context, 60), 0);
			}
		});
		return convertView;
	}
	
	public String formatValue(String value){
		if(1 == value.length()){
	      	   value = "00" + value;
	    }else if(2 == value.length()){
	      	   value = "0" + value;
	    }  
		return value;
	}

}
passself 2013-09-18
  • 打赏
  • 举报
回复
楼主你的问题在adapter里面,你却没有粘贴其代码
jinlingyunhuhu 2013-09-18
  • 打赏
  • 举报
回复
适配器代码?
lxq_xsyu 2013-09-14
  • 打赏
  • 举报
回复
如果是遮住的话,怎么不是每次都遮住,有时能显示,有时不能显示。
lxq_xsyu 2013-09-14
  • 打赏
  • 举报
回复
我再getView中打印log没有输出,说明适配器根本没有绘制。但是getCount有返回值。
Utopia 2013-09-13
  • 打赏
  • 举报
回复
是不是ListView视图被遮住了
别介意 2013-09-13
  • 打赏
  • 举报
回复
把适配器部分的代码粘贴出来啊
lxq_xsyu 2013-09-13
  • 打赏
  • 举报
回复
补充:getView不是每次都不调用,有时候执行,偶尔不执行。但是getCount每次都执行且有值。

80,351

社区成员

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

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