Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在editfield更改输入上重新绘制listfield_List_Blackberry_Repaint - Fatal编程技术网

在editfield更改输入上重新绘制listfield

在editfield更改输入上重新绘制listfield,list,blackberry,repaint,List,Blackberry,Repaint,我在应用程序中使用GooglePlaceAPI搜索位置。当用户在编辑字段中输入文本时,调用的API和结果输出将显示在列表中 我成功地实现了它,但问题是每次编辑字段文本更改时,列表都不会重新绘制,并且输出会添加到列表的末尾。我希望每次编辑文本字段中的文本更改时,列表必须删除其以前无效的内容 这可以在图片中看到: 为了实现这一点,我编写了以下代码: public final class MyScreen扩展主屏幕{ /** *创建一个新的MyScreen对象 */ 私有向量列表元素; 列表字段列

我在应用程序中使用GooglePlaceAPI搜索位置。当用户在编辑字段中输入文本时,调用的API和结果输出将显示在列表中

我成功地实现了它,但问题是每次编辑字段文本更改时,列表都不会重新绘制,并且输出会添加到列表的末尾。我希望每次编辑文本字段中的文本更改时,列表必须删除其以前无效的内容

这可以在图片中看到:

为了实现这一点,我编写了以下代码:

public final class MyScreen扩展主屏幕{
/**
*创建一个新的MyScreen对象
*/
私有向量列表元素;
列表字段列表;
JSONObject[]JSONObject;
编辑字段编辑字段;
字符串url=”https://maps.googleapis.com/maps/api/place/autocomplete/json?input=";
字符串[]locationName;
VerticalFieldManager VerticalFieldManager=新的VerticalFieldManager();
公共MyScreen(){
按钮字段搜索=新按钮字段(“搜索”);
_listElements=新向量();
列表=新列表字段();
ListCallback _callback=新的ListCallback(此);
//设置屏幕显示的标题
setTitle(“搜索编辑字段”);
editfield=新的editfield();
setChangeListener(新的FieldChangeListener(){
公共无效字段已更改(字段,int上下文){
UiApplication.getUiApplication().invokeLater(新的Runnable()){
公开募捐{
list.invalidate();
createField();
}
});
}
});
setCallback(_callback);
添加(编辑字段);
添加(新分隔符字段());
verticalFieldManager.add(列表);
添加(垂直字段管理器);
}
受保护的void createField(){
ShowList();
重载列表();
}
私有void重载列表(){
list.setSize(_liselements.size());
}
类ListCallback实现ListFieldCallback{
我的屏幕列表演示屏幕;
公共ListCallback(MyScreen listDemoScreen){
this.listDemoScreen=listDemoScreen;
}
public void drawListRow(列表字段列表、图形g、整数索引、整数y、,
int w){
String text=(String)\u liselements.elementAt(index);
list.setRowHeight(getFont().getHeight());
g、 drawText(文本,0,y,0,-1);
}
公共对象获取(列表字段列表,int索引){
return _listElements.elementAt(索引);
}
public int indexOfList(列表字段列表、字符串前缀、int字符串){
return _liselements.indexOf(前缀,字符串);
}
public int getPreferredWidth(列表字段列表){
返回Display.getWidth();
}
}
受保护的无效显示列表(){
HttpConnection-httpConn;
输入流输入;
ConnectionFactory connFact=新的ConnectionFactory();
ConnectionDescriptor connDesc;
字符串响应;
String fieldText=editfield.getText();
connDesc=connFact.getConnection(url+fieldText
+“%@&sensor=true&key=xxxxxxxxxxxx”
+getConnectionType());
如果(connDesc!=null){
httpConn=(HttpConnection)connDesc.getConnection();
试一试{
int responseCode=httpConn.getResponseCode();
if(responseCode==HttpConnection.HTTP\u确定){
in=httpConn.openInputStream();
StringBuffer buf=新的StringBuffer();
int read=-1;
而((read=in.read())!=-1)
追加((字符)读取);
response=buf.toString();
试一试{
JSONObject对象=新的JSONObject(响应);
JSONArray ar=object.getJSONArray(“预测”);
jsonobject=新的jsonobject[ar.length()];
locationName=新字符串[ar.length()];
list.invalidate();
对于(int i=0;i
更新和解决方案:

仅修改此项,其余部分工作正常。正如彼得所建议的,我们也可以放一个
线程为了使UI不被阻止:

UiApplication.getUiApplication().invokeLater(new Runnable()){
公开募捐{
_listElements.removeAllElements();
createField();
}
});

我认为您的问题很简单,就是在请求更多数据时没有清除_listedelements向量。所以,列表元素变得越来越大

然而,这里有一个更大的问题,那就是您的代码似乎正在事件线程上运行网络操作。您在changeListener中应该做什么。是启动一个请求数据的线程,然后在此线程获取数据时重新填充ListField

由于此更改,UI将不会被阻止,列表更新将变为异步,因此用户实际上可以在第一个线程响应返回之前在EditField中输入另一个字符。为了避免这看起来很愚蠢,您可以将线程处理延迟几秒钟,以查看是否输入了其他字符,和/或在重新填充之前,可以确保EditField内容与请求的字符相同

我个人更喜欢这种异步方法,但是如果它让您感到困扰,您可以设置一个“请等待-加载”类型的屏幕来阻止用户,直到响应返回

Upd
UiApplication.getUiApplication().invokeLater(new Runnable() {
  public void run() {
    // Ui Code in here 
  }
});