android view-android 自定义适配器不执行getView
package com.dengq.caigou;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.deng.service.DataNewsService;
import com.dengq.caigou.bean.DataField;
import com.dengq.main.R;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
public class CaigouActivity extends Activity {
ListView lstCaigou = null;
EditText edtFind;
List<HashMap<String, Object>> data = null;
//将数据加载到ArrayList数组里面,再在自定义适配器里面将数据加载进去
ArrayList<String> stdno = new ArrayList<String>();
ArrayList<String> nameList = new ArrayList<String>();
ArrayList<String> qgrList = new ArrayList<String>();
ArrayList<Integer> num = new ArrayList<Integer>();
String sSql = "select top 10 F_ZDBH,F_WareName ,F_Num,F_qgr from T_Caigou ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_caigou);
lstCaigou = (ListView) findViewById(R.id.lstCaigou);
edtFind = (EditText) findViewById(R.id.edtFind);
Thread thread = new Thread(runnable);
thread.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.caigou, menu);
return true;
}
public void findRecord(View v) {
Thread thread = new Thread(runnable);
thread.start();
}
Runnable runnable = new Runnable() {
@Override
public void run() {
String sFind = edtFind.getText().toString();
if (sFind.equals("")) {
} else {
sSql = sSql + " where F_warename='" + sFind + "'";
}
//post提交数据然后获取json数据
getDataField(sSql);
Log.d("sql", sSql);
}
};
public void getDataField(String sSql) {
try {
//提交数据请求
List<DataField> dataFields = DataNewsService.postJSONLastNews(sSql,
"T_caigou");
data = new ArrayList<HashMap<String, Object>>();
for (DataField daField : dataFields) {
HashMap<String, Object> item = new HashMap<String, Object>();
item.put("stdNo", daField.getStdNo());
item.put("cName", daField.getFieldname());
item.put("num", daField.getfNum());
item.put("qgr", daField.getQgr());
data.add(item);
Log.d("test", data.toString());
stdno.add(daField.getStdNo());
nameList.add(daField.getFieldname());
num.add(daField.getfNum());
qgrList.add(daField.getQgr());
}
////////////错误主要在这里
//获取数据后加载适配器
ListAdapter listAdapter = new ListAdapter(CaigouActivity.this);
Log.d("test", "--000--");
lstCaigou.setAdapter(listAdapter);//有时加载到这里就不向下运行
Log.d("test", "---1111--");//getCoun返回值一般是10,每次返回两次
listAdapter.notifyDataSetChanged();
CaigouActivity.this.setContentView(lstCaigou);
//////////////////////////////////////////////////////////////////
} catch (Exception e) {
}
}
public final class ViewHolder {
public TextView stdNo;
public TextView name;
public TextView num;
public TextView qgr;
}
class ListAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private ViewHolder holder = null;
public ListAdapter(Context context) {
this.mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
Log.d("testgetCount", String.valueOf(nameList.size()));
return nameList.size();
}
@Override
public Object getItem(int position) {
Log.d("testgetItem", String.valueOf(nameList.get(position)));
return nameList.get(position);
}
@Override
public long getItemId(int position) {
Log.d("getItemIdtest", String.valueOf(position));
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("test", "0001");
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.caigoulist, null);
holder.stdNo = (TextView) convertView.findViewById(R.id.stdNo);
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.num = (TextView) convertView.findViewById(R.id.num);
holder.qgr = (TextView) convertView.findViewById(R.id.qgr);
convertView.setTag(holder);
Log.d("test", "0001-1");
} else {
holder = (ViewHolder) convertView.getTag();
}
//将ArrayList的数据加载到适配器里
Log.d("test", "0002");
final String s = (String) stdno.get(position);
holder.stdNo.setText(s);
final String s1 = (String) nameList.get(position);
holder.name.setText(s1);
final String s2 = (String) qgrList.get(position);
holder.qgr.setText(s2);
final Integer integer = (Integer) num.get(position);
holder.num.setText(integer);
Log.d("test", "0003");
return convertView;
}
}
}
public class DataField {
private String stdNo;
private String fieldname;
private int fNum;
private String qgr;
public DataField(String stdNo, String fieldname, int fNum, String qgr) {
super();
this.stdNo = stdNo;
this.fieldname = fieldname;
this.fNum = fNum;
this.qgr = qgr;
}
public String getQgr() {
return qgr;
}
public void setQgr(String qgr) {
this.qgr = qgr;
}
public String getStdNo() {
return stdNo;
}
public void setStdNo(String stdNo) {
this.stdNo = stdNo;
}
public String getFieldname() {
return fieldname;
}
public void setFieldname(String fieldname) {
this.fieldname = fieldname;
}
public int getfNum() {
return fNum;
}
public void setfNum(int fNum) {
this.fNum = fNum;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
ListAdapter listAdapter = new ListAdapter(CaigouActivity.this);
Log.d("test", "--000--");
lstCaigou.setAdapter(listAdapter);//有时加载到这里就不向下运行
Log.d("test", "---1111--");//getCoun返回值一般是10,每次返回两次
listAdapter.notifyDataSetChanged();
将上面这段移到onCreate里面然后在子线程获取数据后
调用通过Handler发送个消息给UI,接收消息后调用listAdapter.notifyDataSetChanged();
首先,非常同意 龙在天涯 的观点,你的代码非常的乱,让人没有看下去的欲望!!!
你为什么要在线程里面加载自定义适配器
还有更新主界面也不应该在主线程中更新啊
首先,Sky_YiBai说的第一点是对的,如果getCount方法返回的值为空则不调用getView方法;
其次,我看到你是在线程里给listview赋值的,而listview的getview方法在你的程序里应该是执行在thread的方法之前,即刚开始nameList值为空,listview已经生成了,你可以在getcount方法那里加上断点,然后调试,就会发现getcount返回的是0,所以不执行getview。
最后,你的程序写的好乱。太乱了。
晕,你另开了个线程用来更新View,当然不行了。
在主线程里才能更新界面的:
lstCaigou.setAdapter(listAdapter);
listAdapter.notifyDataSetChanged();
这两句就是更新界面的。
你好,我出现过类似的问题,当时我的getview方法不执行,后来从网上找了找原因,第一点,你要保证getCount方法返回的值不为空,这个你的已经不是空了,是吧~,然后我又找了找,发现getview不执行的另外一个原因很多是在布局文件上。我根据这个思路,发现我的布局文件中在我的自定义view外边有一层scrollview,我一查,发现scrollview里面直接嵌套BaswAdapter之类的就会导致getview不执行。说了这么多,中心一个意思,就是你查查你的布局文件,看看有没有类似的情况,希望对你多少有些帮助