2013-10-30 66 views
0

如果没有像list.onLoadListener(列表完成其数据填充)的事件如何访问列表的第一行?在android中加载列表视图时访问列表的第一个项目

当列表重用其行为表现这个听众是不存在的,这是可以理解的。但是,至少有一个项目(第一个项目,位置0)时,我需要访问列表的第一个项目。

设置适配器后列出

list.getChildAt(0) 

返回我空。所以我需要延迟访问第一个项目?

我们可以使用列表项目单击监听器访问列表项目(该项目中的视图)。当我确定列表的第一项已填满时,我想使用项目。

我正在使用TextureView在列表项目中播放视频。所以一旦列表中充满了它的项目,我想自动播放第一个项目的视频(没有任何点击或用户交互)。

这里是我的代码: -

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.home); 

    list = (ListView) v.findViewById(R.id.list); 
      videoListDatas = new ArrayList<VideoListData>(); 
      adapter = new MyVideoListAdapterNew(getActivity(), videoListDatas); 

      list.setAdapter(adapter); 

      getVideoList(); //Method which get data from server 

} 

这里是getVideoList()方法执行

private void getVideoList() { 
    final MyProgressDialog progressDialog = new MyProgressDialog(context); 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      try { 

       // Implementation goes here fill array with data 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        adapter.notifyDataSetChanged(); 
        progressDialog.dismiss(); 

       } 

      }); 
     } 

    }).start(); 
} 

这里是我的适配器

public class MyVideoListAdapterNew extends BaseAdapter { 

Context context; 
private LayoutInflater inflater; 

ArrayList<VideoListData> videoListDatas; 


public MyVideoListAdapterNew(FragmentActivity fragmentActivity, 
     ArrayList<VideoListData> videoListDatas) { 
    context = fragmentActivity; 
    this.videoListDatas = videoListDatas; 
    inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return videoListDatas.size(); 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return videoListDatas.get(position); 
} 

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


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.myvideo_row, null); 

     holder = new ViewHolder(); 


     holder.flVideo = (FrameLayout) convertView 
       .findViewById(R.id.flVideo); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 



    } 

    try { 

     //Filling views by getting values from array 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

if(position == 0){ 
    //Code to play first video automatically 
      }else{ 
        } 

    return convertView; 
} 

private static class ViewHolder { 

    FrameLayout flVideo; 

} 

} 

我知道代码将帮助不大但我只是将它发布在一些人的建议上。

谢谢。

+0

你必须在这里发布一些相关的代码。 –

回答

0

我发现从这个线程这种情况的解决方案: - https://stackoverflow.com/a/6944587/647014

我的要求是尽快访问列表的第一项列表完成其数据加载。这种方式列表等待,直到其数据刷新/加载。

谢谢。

0

您可以使用Custom Adapter进行列表视图,然后您可以截取public View getView(int position, View convertView, ViewGroup parent)方法中任何特定位置的视图。在这里,您可以检查

if(position==0){ 
//do your stuff 
} 

看看这个answer自定义适配器

+0

我已经给了这个尝试,它也可以工作,但这个问题是MyAdapter是我用来填充我的适配器的独立类。所以我只是传递需要参数,如上下文和我的数据。因为我一次只显示一个视频,所以我只有一些全局变量,像我的textureView和它的监听器一样声明。此外,我需要管理几个标志(说列表再次滚动,位置再次为0),所有这些事情都可以完成,但需要一些(状态管理将增加)更多的管理。如果有任何方法可以满足这个要求,那么这样做会很好。 –

+0

@ R.j。我不认为有什么具体的方法可以管理你的变量。当您使用自定义适配器时,您必须通过自己管理这些适配器。 –

0

当您填充列表?你什么时候想要访问第一个元素?如果您使用的片段是onViewCreated,onCreateView方法,您可以在onCreateView方法中填充listview并在onViewCreated方法中访问它。由于活动不同,您可以在onCreate()中填充列表,然后在onStart()或onResume()上访问第一个元素。

+0

我不认为onStart和onResume是为这个意义而建立的。 –

0

不知道这是否是最好的方法,但你可以试试看。

创建一个监听器,看起来像这样

public interface ViewLoadedInterface { 
    public void onFirstViewLoaded(/**add params if you like*/); 
} 

传递InterfaceAdapter。您只需要调用onFirstViewLoaded()方法 当您的第一个View被返回,然后再也不会为该实例调用它,否则在回收开始时会出现一些问题。

当它被调用时,然后在接口的实现中执行list.getChildAt(0)

所以最终实施,将是这个样子

public class YourActivityClass extends Activity implements ViewLoadedInterface { 
    ... 

    @Override 
    public void onFirstViewLoaded() { 
     ... 

     something = list.getChildAt(0); 

     ... 
    } 
} 
+0

看到穆克什库马尔的答案。不一样吗?是的,我得到了一些问题,因为列表重用其观点。这就是为什么我想避免我的实现(其实我正在寻找方法/实现,可以很容易地填补我的要求相比,这个。) –

+0

是的,它是相似的,因为我也使用了一个自定义适配器。但听众部分是不同的。自定义适配器将是要采取的路线。 – Neil

相关问题