4

我在我的项目中设置了listfragment。但似乎我的片段无法通过我的适配器正确完成。其原因是Context contextMyListAdapter。如果我点击纠正它。它变为MenuFragment menuFragment。但是在更改之后,MyListAdapter出现错误。所以我纠正它。它变为Context context。如果我纠正它,它仍然继续下去。它的循环就是这样。使用自定义适配器的ListFragment

注意:我想实现的是带图标的ListFragment。像我之前的其他问题(但不幸的是没有人回答)。

public class MenuFragment extends ListFragment { 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return super.onCreateView(inflater, container, savedInstanceState); 
    } 

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

    String [] proMenu ={ "Homies", "Best Nearby", "Coupon" , "Profile" , "History" , "", "Setting" , 
       "About" , "Sign Out"}; 

    setListAdapter(new MyListAdapter(this, proMenu)); 

} 

@Override 
public void onListItemClick(ListView lv, View v, int position, long id) { 
    Fragment newContent = null; 
    switch (position) { 
    case 0: 
     newContent = new ColorFragment(); 
     break; 
    case 1: 
     Intent intent7 = new Intent(); 
     intent7.setClass(getActivity(), Home.class); 
     intent7.putExtra("index", position); 
     startActivity(intent7); 
     break; 

编辑:这是我的布局。它现在完美无瑕。我只需要调整textview和线性布局,这样一个字就不会减半。但我面临着另一个问题。它就像背景图像堆叠起来一样。这是我的布局上的xml。

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="50dp" 
android:orientation="horizontal" 
android:cacheColorHint="#00000000" 
android:background="@drawable/menu_drawer"> 

<ImageView 
    android:id="@+id/row_icon" 
    android:layout_width="50dp" 
    android:layout_height="50dp" 
    android:padding="10dp" 
    android:src="@drawable/ic_launcher" /> 

<TextView 
    android:id="@+id/row_title" 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="1" 
    android:gravity="center_vertical" 
    android:padding="10dp" 
    android:text="Medium Text" 
    android:textSize="20dp" 
    android:textAppearance="@android:style/TextAppearance.Medium" /> 

</LinearLayout> 

the layout

如果我删除此android:background="@drawable/menu_drawer"linear layout。这将是完美的背景。没有彼此堆放。但是当我在列表中滑动时,背景变得疯狂,它消失了,并显示出一些黑色背景。它像列表视图android:cacheColorHint="#00000000"的问题一样。我已经在linear layout中添加了cachecolor。但它仍然显示出那些黑色背景。就像这样。

this is what happen when i remove <code>android:background</code>

我知道什么这个问题的。因为默认背景是黑色的。但我不知道如何解决它。

编辑2:黑色问题解决。

已解决。

+1

首先,你用'机器人:layout_height =“50dp”'该行高度,这是正常的,该文本将被削减,因为它不能适合身高(尤其是当你使用一个20dp大小(用sp代替))。使用'wrap_content'作为行高。其次,'cacheColorHint'属性需要在ListView中使用,而不是行背景(可以在代码中设置)。 – Luksprog 2013-04-11 08:29:56

+0

谢谢。你为我节省了很多。其实我有1个最后的问题。如何在历史和环境之间创造空间。所以这3个列表将会出现在底部(设置,关于和退出)。 – Nicolas 2013-04-11 14:29:55

+1

如果这是某种菜单,那么最好用一个'LinearLayout'替换'ListView',它将包含这些行,这样就可以像想要的那样分开它们。您仍然可以通过计算屏幕所需的确切空间并添加具有该高度的额外空行来使用“ListView”。 – Luksprog 2013-04-11 14:46:22

回答

7

您不会将有效的Context传递到您的适配器,Fragment不是 a Context。您需要使用,例如,Activity作为Context

setListAdapter(new MyListAdapter(getActivity(), proMenu)); 

我希望你们也实现适配器中getCount()方法,否则你不会看到任何ListView不管有多少个元素你有。

+0

很多非常感谢你这么多非常感谢。终于在一个星期后解决。 FYI =我没有实现getCount(),它仍然完美地工作。但是有一个问题。我的文本看起来不太适合列表。可以说当菜单“附近”。单词“y”的底部并没有填入名单。它只是一半。它就像“你”。 – Nicolas 2013-04-11 05:13:05

+0

@Nicolas文字在底部被切断?你能发布你的布局文件吗? – Luksprog 2013-04-11 06:15:35

+0

我编辑了“添加布局”的问题。谢谢 – Nicolas 2013-04-11 07:21:10

0

创建自定义适配器时,不要将“Context”对象作为参考传递给Activity,只需将Activity对象传递给Custom Adaper即可。

public class HealthAdvice extends ListFragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.health_advice, container, false); 

     return rootView; 

    } 

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

     HealthAdviceArray health_data[] = new HealthAdviceArray[] 
       { 
       new HealthAdviceArray(R.drawable.ic_launcher, "Cloudy"), 
       new HealthAdviceArray(R.drawable.ic_launcher, "Showers"), 
       new HealthAdviceArray(R.drawable.ic_launcher, "Snow"), 
       new HealthAdviceArray(R.drawable.ic_launcher, "Storm"), 
       new HealthAdviceArray(R.drawable.ic_launcher, "Sunny") 
       }; 

     HealthAdviceAdapter adapter = new HealthAdviceAdapter(getActivity(), 
       R.layout.health_advice_item_row, health_data); 

     /** Setting the array adapter to the list view */ 
     setListAdapter(adapter); 

    } 

}// end main class HealthAdvice 
1
Following is the method to create listFragement list view: 
HealthAdvice.java 

package com.example.babs; 


import android.app.ListFragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class HealthAdvice extends ListFragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.health_advice, container, false); 

     return rootView; 

    } 

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

     HealthAdviceArray health_data[] = new HealthAdviceArray[] 
       { 
       new HealthAdviceArray(R.drawable.ic_launcher, "Cloudy"), 
       new HealthAdviceArray(R.drawable.ic_launcher, "Showers"), 
       new HealthAdviceArray(R.drawable.ic_launcher, "Snow"), 
       new HealthAdviceArray(R.drawable.ic_launcher, "Storm"), 
       new HealthAdviceArray(R.drawable.ic_launcher, "Sunny") 
       }; 

     HealthAdviceAdapter adapter = new HealthAdviceAdapter(getActivity(), 
       R.layout.health_advice_item_row, health_data); 

     /** Setting the array adapter to the list view */ 
     setListAdapter(adapter); 

    } 

}// end main class HealthAdvice 

Step 2: 

HealthAdviceAdapter.java 
package com.example.babs; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class HealthAdviceAdapter extends ArrayAdapter<HealthAdviceArray>{ 

    Context context; 
    int layoutResourceId;  
    HealthAdviceArray data[] = null; 

    public HealthAdviceAdapter(Context context, int layoutResourceId, HealthAdviceArray[] data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     HealthAdviceArrayHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new HealthAdviceArrayHolder(); 
      holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
      holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (HealthAdviceArrayHolder)row.getTag(); 
     } 

     HealthAdviceArray weather = data[position]; 
     holder.txtTitle.setText(weather.title); 
     holder.imgIcon.setImageResource(weather.icon); 

     return row; 
    } 

    static class HealthAdviceArrayHolder 
    { 
     ImageView imgIcon; 
     TextView txtTitle; 
    } 
} 

Step 3: 

HealthAdviceArray.java 

package com.example.babs; 


public class HealthAdviceArray { 

    public int icon; 
    public String title; 

    // we are over loading here 
    public HealthAdviceArray(){ 
     super(); 
    } 

    public HealthAdviceArray(int icon, String title) { 
     super(); 
     this.icon = icon; 
     this.title = title; 
    } 

} 

step 4: 

Health Advice health_advice.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FFFFFF" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</LinearLayout> 

step 5: 

Health Advice items: health_advice_item_row.xml 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:padding="10dp" > 

    <ImageView 
     android:id="@+id/imgIcon" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_marginBottom="5dp" 
     android:layout_marginRight="15dp" 
     android:layout_marginTop="5dp" 
     android:contentDescription="@string/image_view" 
     android:gravity="center_vertical" /> 

    <TextView 
     android:id="@+id/txtTitle" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_marginBottom="5dp" 
     android:layout_marginTop="5dp" 
     android:gravity="center_vertical" 
     android:textColor="#000000" 
     android:textSize="22sp" 
     android:textStyle="bold" /> 

</LinearLayout> 
相关问题