Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.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
android中的Listview在拖动之前没有刷新视图_Android_Layout_Android Listview_Refresh - Fatal编程技术网

android中的Listview在拖动之前没有刷新视图

android中的Listview在拖动之前没有刷新视图,android,layout,android-listview,refresh,Android,Layout,Android Listview,Refresh,我使用的代码如下: private Runnable returnRes = new Runnable() { @Override public void run() { if(m_orders != null && m_orders.size() > 0){ m_adapter.notifyDataSetChanged(); for(int i=0;i

我使用的代码如下:

private Runnable returnRes = new Runnable() {

        @Override
        public void run() {
            if(m_orders != null && m_orders.size() > 0){
                m_adapter.notifyDataSetChanged();
                for(int i=0;i<m_orders.size();i++)
                m_adapter.add(m_orders.get(i));
            }
            m_ProgressDialog.dismiss();
            m_adapter.notifyDataSetChanged();
        }
      };
从LogCat的追踪中,我只能找到位置3:(有什么问题? 有人请帮帮我

LoginByHttpPost gradeIndex = new LoginByHttpPost();
    HttpURLConnection gradePage = gradeIndex.doHttpGet(TARGETURL);
    String gradeInd = gradeIndex.readResponse(gradePage);

    Document doc = Jsoup.parse(gradeInd);
    // do more things here


    Log.d("grade now ", grades.get(0).text());
    Log.d("gradef now ", gradesF.text());

    for(int i = 0; i < grades.size(); i += 5){
        Grade grade = new Grade();
        grade.setId(grades.get(i).text());
        grade.setName(grades.get(i + 1).text());
        //gradeList.add(grade);
        ga.add(grade);    //this is my arrayadapter not sure where to add my object to through :(

    }

    for(int i = 0; i < gradesF.size(); i++){
        gradeList.get(i).setGrade(gradesF.get(i).text());
    }



} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    Log.d("prob", e.getMessage());

}
loginbyhttpost gradeIndex=new loginbyhttpost();
HttpURLConnection gradePage=gradeIndex.doHttpGet(TARGETURL);
字符串gradeInd=gradeIndex.readResponse(gradePage);
Document doc=Jsoup.parse(gradeInd);
//在这里做更多的事情
Log.d(“立即评分”,grades.get(0.text());
Log.d(“gradef now”,gradesF.text());
对于(int i=0;i

这是从函数doInBackground()中的asyncatask调用的。

您应该在UI线程中调用
notifyDataSetChanged()
,尝试使用
runOnUiThread()

第二件事是
notifyDataSetChanged()
只应在添加、删除和清除函数后调用。

您想在后台执行某些操作,然后将一些更改发送到UI,对吗?如果要执行此操作,您应该使用一种更简单、更有效的后台处理方法。只要您想更改UI,只需调用onProgressUpdate()然后执行所需操作。

您可以通过调用
listView1.requestLayout()
listView1.setAdapter(adapter)
尝试刷新listview。您也可以尝试
adapter.notifyDataSetChanged()
。如果在listview上滚动使视图可见,您也可以尝试将listview滚动到底部,然后以编程方式滚动回原始位置

更新:

我认为问题可能来自getView()函数。请尝试将其更改为:

public View getView(int position, View convertView, ViewGroup parent)
{
    View v = convertView;
    if (v == null)
    {
        LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.row, null);    
        Log.d("added", "g" + position);
    }
    Grade g = grades.get(position);
    if(g != null)
    {
        TextView name = (TextView) findViewById(R.id.bottomtext);
        TextView id = (TextView) findViewById(R.id.toptext);
        if(name != null)
        {
            name.setText(g.getName());
        }
        if(id != null)
        {
            id.setText(g.getId());
        }
        Log.d("grade", "grade " + g.toString());    
    }

    return v;
}
尝试调用列表视图。对我有用


即使调用notifyDataSetChanged()和/或notifyDataSetionValidated()也可以从适配器上的UI线程来看,这些只会使数据无效,而不会使视图无效。因此。

我遇到了类似的问题。一个简单的文件管理器:如果我有一个图像,我必须使用单独的线程来调整它的大小。因此,在调整大小的图像准备好之前,我会显示一个占位符。之后,我必须调用notifyDataSetChanged()我的解决方案是在适配器上使用这样的处理程序

公共最终处理程序fileArrayAdapterHandler=新处理程序(){

})

在线程的末尾,我向处理程序发送一条空消息。。。。
使用不同的消息,您可以做许多其他事情…

我遇到了相同的问题,我缺少的是位置并非总是被发送,例如跳过(位置0和2),并且在我滚动之前不会更新

为我解决这个问题(请参阅我使用了asynctask)的出发点是:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
   LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    ...

    new AsyncTask<ViewHolder, Void, Bitmap>() {
            private ViewHolder v;

            @Override
            protected Bitmap doInBackground(ViewHolder... params) {
                // Code
            }

            @Override
            protected void onPostExecute(Bitmap result) {
                super.onPostExecute(result);
                if (v.position == position) {
                   // Code
                }
            }
    }.execute(viewHolder);

   return convertView;
}
@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
...
新建异步任务(){
私人持票人v;
@凌驾
受保护的位图背景(ViewHolder…参数){
//代码
}
@凌驾
受保护的void onPostExecute(位图结果){
super.onPostExecute(结果);
如果(v.position==位置){
//代码
}
}
}.执行(持票人);
返回视图;
}
为此(创建了一个内部类,在构造函数中传递位置):

@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
....               
新下载图像(位置)。执行(视图持有者);
返回视图;
}
私有类DownloadImage扩展异步任务{
私人持票人v;
私人职位;
公共下载图像(INTP){
myPosition=p;
}
@凌驾
受保护的位图背景(ViewHolder…参数){
//代码
返回结果;
}
@凌驾
受保护的void onPostExecute(位图结果){
super.onPostExecute(结果);
如果(v.position==myPosition){
//代码
}
}
}

正如其他一些人已经指出的那样,这个问题是由于用户界面线程上没有调用代码造成的,因为您是从异步任务执行它的。因为我还不能评论,这里是另一个答案

我也面临同样的问题:我更新了数据(保存在静态上下文中),但在适配器上调用notifyDataSetChanged()后listview没有更新。拖动/滚动后,UI会更新,数据会自动刷新

问题是,只有创建视图层次结构的原始线程才能接触其视图。我假设您正在从回调运行Runnable,因此,您需要在UI线程上调用它,以使listview自我更新,在一个片段中,您可以按照以下行式执行操作:

getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                  // Change the data source here,
                  // eg. some ArrayList<ItemObject> in this case
                  someDataSource.clear();
                  someDataSource.add(new ItemObject());
                  // ...

                  // And notify the adapter of the changes to the data source
                  adapter.notifyDataSetChanged();
                }
});
getActivity().runOnUiThread(新的Runnable()){
@凌驾
公开募捐{
//在此处更改数据源,
//在这种情况下,一些ArrayList
someDataSource.clear();
添加(newitemObject());
// ...
@Override
public View getView(int position, View convertView, ViewGroup parent) {
   LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    ...

    new AsyncTask<ViewHolder, Void, Bitmap>() {
            private ViewHolder v;

            @Override
            protected Bitmap doInBackground(ViewHolder... params) {
                // Code
            }

            @Override
            protected void onPostExecute(Bitmap result) {
                super.onPostExecute(result);
                if (v.position == position) {
                   // Code
                }
            }
    }.execute(viewHolder);

   return convertView;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    ....               

    new DownloadImage(position).execute(viewHolder);        

    return convertView;
}

private class DownloadImage extends  AsyncTask<ViewHolder, Void, Bitmap> {

        private ViewHolder v;    
        private int myPosition;

        public  DownloadImage(int p) {
            myPosition = p;
        }

        @Override
        protected Bitmap doInBackground(ViewHolder... params) {
            // Code
            return result;
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            super.onPostExecute(result);
            if (v.position == myPosition) {
                // Code
            }
        }
    }
getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                  // Change the data source here,
                  // eg. some ArrayList<ItemObject> in this case
                  someDataSource.clear();
                  someDataSource.add(new ItemObject());
                  // ...

                  // And notify the adapter of the changes to the data source
                  adapter.notifyDataSetChanged();
                }
});
Message m = new Message();
m.what = MessageYouDefined;
mHandler.sendMessage(m);
mHandler=new Handler(){
    public void handleMessage(Message msg)
    {
        switch (msg.what){
             case UpdateChargerList:
             chargerAdapter.notifyDataSetChanged();
             break;
         }
         super.handleMessage(msg);
    }
};