2014-03-27 86 views
1

它我在这里的第一篇文章,但我读这个问答&一个多年,我总能找到一个答案,但这个时候,我无法找到它,或者我不能与我的问题相结合多个答案。我希望你能帮忙。Android的碎片+自定义列表视图

所以我有一个覆盖onCreateView

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     db = new WineryDatabaseAdapter(getActivity()); 
     bacveList = db.getBacve(); 

     v = inflater.inflate(R.layout.sve_bacve, container, false); 
     Log.v("onCreateView", "oncreateview"); 
     return v; 
    } 

然后,我有方法,我把我的数据

public void getBacveItems(){ 
     ArrayAdapter<Bacve> ad = new BacveListAdapter(getActivity(), bacveList); 
     lv = (ListView) v.findViewById(R.id.listSveBacve); 
     lv.setAdapter(ad); 
     lv.setOnItemClickListener(this); 
     Log.v("getBacveItems", "getBacveItems"); 
    } 

在该方法中,我打电话给我的适配器,所以我可以用我的ListView布局片段

public class BacveListAdapter extends ArrayAdapter<Bacve>{ 

    List<Bacve> bacve; 
    Context c; 
    String[] values = new String[] { "prva","druga" }; 

    public BacveListAdapter(Context c,List<Bacve> l){ 

     //super(c,R.layout.sve_bacve_item,l); 
     super(c,R.layout.sve_bacve_item,l); 
     Log.v("BacveListAdapter", "BacveListAdapter"); 
     this.bacve = l; 
     this.c = c; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
    View iv = convertView; 
    TextView tv; 
    if (iv == null){ 
     iv = (View)((LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.sve_bacve,parent,false); 
     tv = new TextView(c); 
    } 
    else{ 
    Bacve bacva = bacve.get(position); 
    tv = (TextView) iv.findViewById(R.id.textNazivBacve); 
    tv.setText(bacva.getIme()); 
    } 
    return iv; 
    } 

}

但出于某种原因试图访问电视机时,我收到错误。它始终为空。

我认为它与创建/ getted意见的东西,和我创建/得到一些父视图更高的层次。我试图调试它,但不知道如何在调试模式下使用这些ID。好了没怎么用它,但如何比较,所以我可以看到它是右视图。

请帮助:)

我做到了,这样在这个编辑,但一无所获。是因为我使用滑动视图,并且在第一个视图中出现错误视图?

这是我sve_bacve_item,它有TextView的。 我是那种向前1步与@Raghunandan解决方案,但现在我有convertin字符串持有人的问题。我正在努力解决这个问题。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<TextView 
    android:id="@+id/textNazivBacve" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_marginLeft="15dp" 
    android:layout_marginTop="15dp" 
    android:layout_toRightOf="@+id/bacveIcon" 
    android:text="@string/BacveNaziv" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

<ImageView 
    android:id="@+id/bacveIcon" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignTop="@+id/textNazivBacve" 
    android:adjustViewBounds="true" 
    android:contentDescription="@string/Bacve" 
    android:maxHeight="120dp" 
    android:maxWidth="120dp" 
    android:src="@drawable/bacve_item" /> 

</RelativeLayout> 

BR

+0

为什么IV == NULL?也许是虚假的问题,但他不是想膨胀R.layout.sve_bacve? – Veki

+0

当它膨胀时它会膨胀并且当你膨胀布局时你需要初始化视图。阅读http://stackoverflow.com/questions/11945563/how-listviews-recycling-mechanism-works – Raghunandan

+0

立即查看我的帖子 – Raghunandan

回答

0

使用perofrmance一个ViewHolder

public static ViewHolder 
{ 
    TextView tv; 
} 

更改为

LayoutInflater mInflater; 
public BacveListAdapter(Context c,List<Bacve> l){ 

     //super(c,R.layout.sve_bacve_item,l); 
     super(c,R.layout.sve_bacve_item,l); 
     mInflater = LayoutInflater.from(c); 
     this.bacve = l; 
     this.c = c; 
    } 

变化getView

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

    ViewHolder holder; 

    if (convertView == null){ 
    convertView = (View) mInflater.inflate(R.layout.sve_bacve,parent,false); 
    holder = new ViewHolder(); 
    holder.tv = (TextView) convertView.findViewById(R.id.textNazivBacve); 
    convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder) convertView.getTag();    
    } 
    Bacve bacva = bacve.get(position); 
    holder.tv.setText(bacva.getIme()); 

    return convertView; 
} 

你也提到

这是我sve_bacve_item,它有TextView的

因此改变

convertView = (View) mInflater.inflate(R.layout.sve_bacve,parent,false); 

convertView = (View) mInflater.inflate(R.layout.sve_bacve_item,parent,false); 

编辑:

你NPE是因为你夸大了错误的布局。我第一次感到困惑。

你也有评论这

public BacveListAdapter(Context c,List<Bacve> l){ 

    //super(c,R.layout.sve_bacve_item,l); 

删除注释

public BacveListAdapter(Context c,List<Bacve> l){ 
    super(c,R.layout.sve_bacve_item,l); 

,并做检查此了解ViewHolder模式理解为什么你需要它。

一个ViewHolder对象中的每个布局的标签 领域内组件的意见,这样你就可以立即而不 需要反复看看他们访问他们的商店。

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

,并检查

How ListView's recycling mechanism works

+0

是的,我做了它,现在它可以工作,但它让我感到困惑,因为这样。 非常感谢你们 – Veki

+0

我不确定我看到使用ViewHolder的重点。只是增加额外的没有理由 – Spidy

+0

@spidy可能只是一个textview,但它确实有帮助 – Raghunandan

0

我猜你的布局没有TextView的定义,因为你的代码应该如下所示:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
    convertView = (View)((LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.sve_bacve_item,parent,false); 
    } 

    TextView tv = (TextView)convertView.findViewById(R.id.textNazivBacve); 
    Bacve bacva = bacve.get(position); 
    tv.setText(bacva.getIme()); 

    return iv; 
} 

而你的自定义布局应该有一个文本视图定义索姆在你的布局文件中就像这样。

<TextView android:id="@+id/textNazivBacve" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Hello, I am a TextView" /> 

UPDATE

好了,它看起来像你的布局文件看起来很好。您仍然不需要按照您尝试的方式创建TextView。你可以简单地findView。有一件事我注意到,你的充气呼叫是使用错误的布局(sve_bacve而不是sve_bacve_item),这就是为什么它无法找到文本视图。

这条线:

convertView = (View) mInflater.inflate(R.layout.sve_bacve,parent,false); 

应该是:

convertView = (View) mInflater.inflate(R.layout.sve_bacve_item,parent,false); 
+0

Omg,也许我很疯狂,但是这对我来说很好看。我已将@Raghunandan改为sve_bacve_item,现在可以运行。 但是,为什么我把我的布局在适配器超类?我以为我打电话查看,我的列表视图是,然后我从该列表查看我的项目布局。 – Veki

+0

从技术上讲,您可以将0赋给超类,因为您重写了getView。如果您没有重写getView,则数组适配器基类将使用您传入的资源。只是子类化ArrayAdapter的一个细微差别。 – Spidy

+0

哦,现在我明白了。我没有这样想,我会重写这个布局,我已经通过了。非常感谢 – Veki