当前位置:编程学习 > wap >>

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

我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方法不执行,这是怎么回事呢? listview 适配器 adapter BaseAdapter getView --------------------编程问答-------------------- 补充:getView不是每次都不调用,有时候执行,偶尔不执行。但是getCount每次都执行且有值。 --------------------编程问答-------------------- 把适配器部分的代码粘贴出来啊 --------------------编程问答-------------------- 是不是ListView视图被遮住了 --------------------编程问答-------------------- 我再getView中打印log没有输出,说明适配器根本没有绘制。但是getCount有返回值。 --------------------编程问答-------------------- 如果是遮住的话,怎么不是每次都遮住,有时能显示,有时不能显示。 --------------------编程问答-------------------- 适配器代码? --------------------编程问答-------------------- 楼主你的问题在adapter里面,你却没有粘贴其代码 --------------------编程问答--------------------



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;
}

}
--------------------编程问答-------------------- 适配器代码已贴出来,哪位大神知道问题所在 --------------------编程问答--------------------  convertView = mInflater.inflate(R.layout.validate01_cell, null);这里啊~
convertView是移出屏幕的View对象,你一开始加载时没有移出屏幕的View对象,这里肯定是null,你返回出去也没用啊
你要用View类去创建啊,不能用convertView --------------------编程问答-------------------- 把 popupview = mInflater.inflate(R.layout.validate_popupwindow, null);换成
 popupview = mInflater.inflate(R.layout.validate_popupwindow, parent,false); --------------------编程问答-------------------- 你getview中每判断一下convertView是不是为null,可以复用view,你这样效率很低。
还有,你的代码你就不能封装一下,一团乱麻。一看就是新手写的。 --------------------编程问答--------------------
引用 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呢? --------------------编程问答--------------------
引用 11 楼 zhuangyiyou 的回复:
把 popupview = mInflater.inflate(R.layout.validate_popupwindow, null);换成
 popupview = mInflater.inflate(R.layout.validate_popupwindow, parent,false);

能不能解释一下parent和false这两个参数的作用,谢谢! --------------------编程问答--------------------
引用
@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;
}

这样改也不行啊,可能不是这个问题,我前面这样写过? --------------------编程问答--------------------
 @Override
    public Object getItem(int pos) {
        // TODO Auto-generated method stub
        return null;
    }


改成

 @Override
    public Object getItem(int pos) {
        return datas[pos];
    }
--------------------编程问答-------------------- 在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();
            }

有没有人遇到过这个问题,麻烦解决一下 --------------------编程问答-------------------- 呵呵,我问题都解决了,谢谢各位
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,