使用自定义布局在Sherlocklistfragment中显示drawable

时间:2013-05-06 12:55:07

标签: android hashmap actionbarsherlock drawable

我试图从安装在Android设备上的软件包中显示drawables:“com.android.browser”以显示应用程序的图标。 我已经使用此布局设置了sherlocklistfragment

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="match_parent"
android:orientation="horizontal" >


<ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

     />

<TextView
    android:id="@+id/appName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Medium Text"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
    android:id="@+id/numOpen"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Medium Text"
    android:textAppearance="?android:attr/textAppearanceMedium" />

 </LinearLayout>

然后我使用hashmap来处理simpleAdapter的数据

Sherlocklistfragment

public class List_fragment extends SherlockListFragment {
private PackageManager pk;
String[] apps = new String[] {
        "Browser",
        "Email",
        "Facebook",
        "Clock",
        "Map",
        "Calendar",
        "Settings",
        "Media player",
        "Google play",
        "testapp"
    };
String[] period = new String[]{
        "54",
        "23",
        "42",
        "23",
        "14",
        "23",
        "23",
        "1",
        "10",
        "12"
    };
public final static String TABLE_LOGS = "logs";
public final static String ID_COL = "_id";
public final static String DATE_COL = "date";
public final static String PACKAGE_COL = "package";
public final static String LAT_COL = "lat";
public final static String LNG_COL = "lng";
public final static String DUR_COL = "duration";
View view;
private OnItemClickListener mOnItemClickListener;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    List<HashMap<String,Object>> aList = new ArrayList<HashMap<String,Object>>();
    pk = getSherlockActivity().getPackageManager();
    Drawable drawable = null;
    for(int i=0;i<10;i++){
        HashMap<String, Object> hm = new HashMap<String,Object>();
        hm.put("app", "" + apps[i]);
        hm.put("per", period[i] + " seconds");
        try {
            drawable = pk.getApplicationIcon("com.android.browser");
            //hm.put("image", drawable);
            hm.put("image", R.drawable.down_arrow);

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

        aList.add(hm);
    }
    Log.d("DRAWABLE", " "+ drawable);
    SimpleAdapter listAdapter = new SimpleAdapter(inflater.getContext(), aList, 
             R.layout.list_layout, new String[] {"image", "app", "per"}, new int[] {R.id.imageView, R.id.appName, R.id.numOpen});
    //listAdapter.setViewBinder(mViewBinder);
    setListAdapter(listAdapter);
    Log.d("String " , " " + aList);

    return super.onCreateView(inflater, container, savedInstanceState);
}
private final SimpleAdapter.ViewBinder mViewBinder = new SimpleAdapter.ViewBinder() {

    @Override
    public boolean setViewValue(View view, Object data,
            String textRepresentation) {
        // TODO Auto-generated method stub
        if(view instanceof ImageView){
            ((ImageView) view).setImageDrawable((Drawable) data);
        }
        return false;
    }
};
 }

编辑:代码

这显示appName的文本和imageview上的箭头图标,但它是否显示我已插入简单适配器的drawable? 请参阅此注释行:

 //hm.put("image", drawable);

我做错了什么?

3 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,但首先,您的片段布局应该有ListView

  

屏幕布局

     

ListFragment具有由单个列表视图组成的默认布局。但是,如果需要,可以通过从onCreateView(LayoutInflater,ViewGroup,Bundle)返回自己的视图层次结构来自定义片段布局。为此,您的视图层次结构必须包含一个ID为“@android:id / list”的ListView对象(如果它在代码中则列出)

     

可选地,视图层次结构可以包含列表视图为空时要显示的任何类型的另一个视图对象。这个“空列表”通知符必须有一个id“android:empty”。请注意,当存在空视图时,如果没有要显示的数据,将隐藏列表视图。 Android Documentation

当您使用SherlockListFragment时,您的布局必须ListView具有预定义的android:id=@android:id/list

  

行布局

     

您可以指定列表中各行的布局。您可以通过在片段托管的ListAdapter对象中指定布局资源来实现此目的(ListAdapter将ListView绑定到数据;稍后将详细介绍)。

     

ListAdapter构造函数接受一个参数,该参数指定每行的布局资源。它还有两个附加参数,可用于指定与行布局资源中的哪个对象关联的数据字段。这两个参数通常是并行数组。 Android Documentation

您必须使用单独的 xml 定义行布局,或者为其构建动态 每一行。第一个选项更普遍。

正如@Johannes对SimpleAdapter所说,你必须只有TextViewHere您可以仅使用TextView来查看自定义布局的示例。因此,您必须使用/扩展另一个ListAdapter,例如ArrayAdapter甚至BaseAdapter

最重要的是方法getView,这是负责的方法 返回将放在ListView的每一行的视图。在此方法中,您必须为行布局充气并填充它。

此链接显示complex custom layout example using BaseAdapter。您可以查看此链接,显示basic custom layout更好地了解您的具体操作。

答案 1 :(得分:0)

来自http://developer.android.com/reference/android/widget/SimpleAdapter.html#SimpleAdapter

对于参数(最后一个,你的imageView1和textView1:

  

应该在&#34; from&#34;中显示列的视图参数。 这些都应该是TextViews。此列表中的前N个视图将被赋予   from参数中前N列的值。

答案 2 :(得分:0)

我现在已经解决了我的问题。谢谢你的帮助。

使用http://android-er.blogspot.dk/2012/03/display-video-thumbnail-on-listfragment.html我创建了一个row.xml布局文件和一个自定义游标适配器,如下所示:

光标适配器

 public class MyCursorAdapter extends SimpleCursorAdapter{
    public MyCursorAdapter(Context context, int layout, Cursor c, String[] from,     int[] to){
        super(context, layout, c, from, to);

    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        LayoutInflater inflater = getSherlockActivity().getLayoutInflater();
        View row = inflater.inflate(R.layout.row, parent, false);
        TextView text1 = (TextView)row.findViewById(R.id.text1);
        TextView text2 = (TextView)row.findViewById(R.id.text2);
        ImageView image1 = (ImageView)row.findViewById(R.id.image1);
        Cursor cursor = adapter.getCursor();
        cursor.moveToPosition(position);
        try {
            info =    pk.getApplicationInfo(cursor.getString(cursor.getColumnIndex(PACKAGE_COL)), 0);
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String title = (String) pk.getApplicationLabel(info);
        text1.setText(title);
        String duration = cursor.getString(cursor.getColumnIndex(DUR_COL));
        text2.setText("App open for " + duration + " seconds");

        BitmapFactory.Options options = new BitmapFactory.Options();
          options.inDither = false;
          options.inPreferredConfig = Bitmap.Config.ARGB_8888;
          Drawable d = info.loadIcon(pk);
          image1.setImageDrawable(d);


          return row;
    }
}

<强>布局

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

 <ImageView
 android:id="@+id/image1"
 android:layout_width="75dp"
 android:layout_height="75dp"
 android:src="@drawable/ic_launcher"/>
 <LinearLayout 
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:orientation="vertical">
 <TextView
 android:id="@+id/text1"
 android:textSize="22dp"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"/>
 <TextView
 android:id="@+id/text2"
 android:textSize="18dp"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"/>

 </LinearLayout>



 </LinearLayout>
 <ImageView
 android:id="@+id/image2"
 android:layout_width="40dp"
 android:layout_height="40dp"
 android:src="@drawable/arrow"
 android:layout_centerVertical="true"
 android:layout_alignParentRight="true"
  />
 </RelativeLayout>