0

我试图从安装在 android 设备示例的包中显示可绘制对象:“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 的数据

夏洛克列表片段

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 上的箭头图标,但它确实显示了我在简单适配器中插入的可绘制对象?请参阅此注释行:

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

我究竟做错了什么?

4

3 回答 3

1

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

屏幕布局

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

或者,您的视图层次结构可以包含任何类型的另一个视图对象,以便在列表视图为空时显示。这个“空列表”通知程序必须有一个 id “android:empty”。请注意,当存在空视图时,列表视图将在没有数据显示时隐藏。安卓文档

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

行布局

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

ListAdapter 构造函数采用一个参数,该参数为每一行指定一个布局资源。它还有两个附加参数,可让您指定与行布局资源中的哪个对象关联的数据字段。这两个参数通常是并行数组。安卓文档

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

正如@Johannes 所说,SimpleAdapter你必须只有TextView. 在这里,您可以查看仅使用自定义布局的示例TextView。所以你必须使用/扩展另一个ListAdapter,例如 aArrayAdapter甚至 a BaseAdapter

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

此链接显示了一个使用 BaseAdapter 的复杂自定义布局示例。您可以查看显示基本自定义布局的此链接,以便更好地了解您必须做什么。

于 2013-05-06T13:26:40.290 回答
0

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

对于 Parameter to (最后一个,你的 imageView1 和 textView1:

应在“from”参数中显示列的视图。这些都应该是 TextViews。此列表中的前 N ​​个视图被赋予 from 参数中前 N 列的值。

于 2013-05-06T13:03:17.757 回答
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>
于 2013-05-07T10:46:28.410 回答