1

我不是 Java/Android 方面的专家,但我仍在努力。

我只是想知道您使用图标和文本制作自定义 ListView。

list (listView1) 是我想要图标的 ListView...

这是我的代码:

list = (ListView) findViewById(R.id.listView1);
    adapter = new ArrayAdapter<String>(this,
            R.layout.custom,
            R.id.app_name,
            listItems);
    list.setAdapter(adapter);

    list2 = (ListView) findViewById(R.id.listView2); adapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems2); list2.setAdapter(adapter2);

    Directory directory = new Directory(Environment.getExternalStorageDirectory()); File[] files = directory.getFiles("*.apk", true);
    for (int i = 0; i < files.length; i++) {
        String apkPath = files[i].getPath() + files[i].getName();
        listItems2.add(apkPath); adapter.notifyDataSetChanged();
        PackageManager pm = getPackageManager();
        PackageInfo    pi = pm.getPackageArchiveInfo(apkPath, 0);
        pi.applicationInfo.sourceDir       = apkPath;
        pi.applicationInfo.publicSourceDir = apkPath;
        String AppName = (String)pi.applicationInfo.loadLabel(pm);
        //Drawable APKicon = pi.applicationInfo.loadIcon(pm);

        //<Here i get error when i try to change icon.>
        ImageView icon = (ImageView) findViewById(R.id.app_icon);
        icon.setImageResource(R.drawable.about);
        //<>

        listItems.add(AppName);
    }

这是我的“custom.xml”代码:

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

<ImageView android:id="@+id/app_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" />
<TextView android:id="@+id/app_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toRightOf="@+id/app_icon" android:text="" android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>
4

3 回答 3

4

好的,为了更好地了解如何实现自定义列表视图,我建议您查看本教程。现在,寻找你的问题。第一个问题出现是因为您使用 ArrayAdapter 来制作动态列表。看看从教程中检索到的解释。

ArrayAdapter 的输入 ArrayAdapter 类可以处理任何Java 对象作为输入。它将这个输入的数据映射到布局中的 TextView。您可以在构造函数中定义一个,否则将使用 android.R.id.text1 ID。

ArrayAdapter 使用数据输入对象的 toString() 方法来确定应该显示的字符串。

添加和删​​除数据 ArrayAdapter 类允许使用 clear() 方法调用删除其底层数据结构中的所有元素。然后,您可以通过 add() 方法添加新元素或通过 addAll() 方法添加 Collection。

也可以直接修改底层数据结构,调用适配器上的 notifyDataSetChanged() 方法,通知他数据的变化。

警告 如果您想更改适配器中的数据,则底层数据结构必须支持此操作。例如,ArrayList 类就是这种情况,但数组却不是。

所以,你的第一个问题是,你在你的适配器上设置它之后改变/填充你的数组。你应该改变这个。

关于在每一行上放一个图标。为此,您必须编写一个自定义适配器。例如,您可以扩展自定义适配器来执行此操作。

再次,从教程中检索。

开发自定义适配器 要控制数据分配并支持对多个视图的分配,您需要创建自己的适配器实现。为此,您将扩展现有的适配器实现或直接对 BaseAdapter 类进行子类化。

ListView 为每个数据元素调用适配器上的 getView() 方法。在此方法中,适配器确定行的布局以及数据如何映射到此布局中的视图。

这个布局的根通常是一个 ViewGroup (LayoutManager) 并且包含几个其他的 View,例如一个 ImageView 和一个 TextView。

因此,下面的代码实现了一个自定义 listView。在每一行我们有两个文本视图和图标。看一看(您可以在此处查看完整示例(Example CustomListView)):

结果:

最后结果

list_layout.xml

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

 <ListView android:id="@android:id/list" android:layout_width="match_parent"
 android:layout_height="match_parent" android:background="#EEEEEE"/>

 <TextView android:id="@android:id/empty" android:layout_width="match_parent"
 android:layout_height="wrap_content" android:background="#0000FF"
 android:text="@string/list_is_empty"/>  

</LinearLayout>

two_line_icon.xml

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

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

 <LinearLayout 
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical"
  >

    <TextView android:id="@+id/text1" android:layout_width="match_parent"
  android:layout_height="wrap_content" android:text="Texto 1"/>

<TextView android:id="@+id/text2" android:layout_width="match_parent"
  android:layout_height="wrap_content" android:text="Descricao"/>

 </LinearLayout>

</LinearLayout>

ListWithIcon.java

public class ListWithIcon extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_layout);

    String[] dados = {"Item 1", "Item 2", "Item 3",
            "Item 4", "Item 5", "Item 6", "Item 7"};

    String[] dados2 = {"desc 1", "desc 2", "desc 3",
            "desc 4", "desc 5", "desc 6", "desc 7"};

    MyAdapter myAdapter = new MyAdapter(this, dados, dados2); 

    setListAdapter(myAdapter);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Toast.makeText(this, l.getItemAtPosition(position).toString(),
            Toast.LENGTH_SHORT).show();
}

}

我的适配器.java

public class MyAdapter extends BaseAdapter {

private String[] data;
private String[] data2;
private Context context;

public MyAdapter(Context context, String[] data1, String[] data2) {
    super();
    this.data = data1;
    this.data2 = data2;
    this.context = context;
}

@Override
public int getCount() {
    return data.length;
}

@Override
public Object getItem(int position) {
    return data[position];
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = LayoutInflater.from(context).
            inflate(R.layout.two_line_icon, parent, false);

    TextView text1 = (TextView) rowView.findViewById(R.id.text1);
    TextView text2 = (TextView) rowView.findViewById(R.id.text2);
    ImageView icon = (ImageView) rowView.findViewById(R.id.icon);

    text1.setText(data[position]);
    text2.setText(data2[position]);
    icon.setImageResource(R.drawable.ic_launcher);

    return rowView;
}

}
于 2013-05-27T17:27:52.963 回答
1

它易于实现。它在我身边工作正常。希望它会帮助你。

创建 xml 文件:checklist.xml

<?xml version="1.0" encoding="utf-8" ?> 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/listLayout"
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:orientation="vertical">
 <LinearLayout  
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal"
 >
  <TextView android:id="@+id/listTitle" 
       android:layout_width="wrap_content" 
       android:layout_height="40dip" 
       android:textColor="#4E4E4E"
       android:layout_gravity="left"
       android:gravity="center_vertical"
       android:paddingLeft="5dip"
       android:singleLine="true"
       android:ellipsize="end"
       android:textSize="15sp"
     />    
   <LinearLayout 
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:gravity="right"
       android:layout_gravity="center_vertical"
       android:layout_marginRight="5dip"
       >
     <ImageView
        android:id="@+id/listIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/arrow_for_list" >
    </ImageView>          
   </LinearLayout>

  </LinearLayout>
 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="1dp"
    android:background="#DEDEDE"
 ></LinearLayout>
</LinearLayout>

现在为 listview 创建 java 类。

LazyAdapter.java

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.nepotech.android.tld.R;

public class LazyAdapter extends BaseAdapter {

    private Activity activity;
    private String[] itemList;
    private static LayoutInflater inflater=null;

    public LazyAdapter(Activity a,String[] il) {
        fromQueue = 0;
        activity = a;
        itemList = il;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }   

    public int getCount() {
        return itemList.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public static class ViewHolder{
        public TextView textList;
     }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        ViewHolder holder;
        if(convertView==null){
                vi = inflater.inflate(R.layout.checklist, null);


            holder.textList=(TextView)vi.findViewById(R.id.listTitle);

            vi.setTag(holder);
        }
        else
            holder=(ViewHolder)vi.getTag();

            holder.textList.setText(itemList[position]);        

        return vi;
    }
}

最后在你的 mainactivity 中像这样调用lazyadapter:

在我的例子中,这里是名为 HomeActivity.java 的 Activity。

    ListView listHome = (ListView)findViewById(R.id.check_list);
    LazyAdapter checkList_adapter = new LazyAdapter(HomeActivity.this,checkListArray,listArray);// where listArray is the String[] containing listing items in listview.
   listHome.setAdapter(checkList_adapter);

并在您的 main_activity xml 中添加您想要的列表视图,例如:。

<ListView
android:id="@+id/check_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="none"
android:fadingEdge="none"
android:listSelector="@drawable/list_selector"
android:choiceMode="singleChoice"
>   
</ListView>
于 2013-05-28T03:04:13.070 回答
0

您需要实现自定义适配器,以防您在每一行中显示不同的图像。到那时,您可以开始学习使用以下链接来实现它:

http://www.javasrilankansupport.com/2012/05/android-listview-example-with-image-and.html

http://theopentutorials.com/tutorials/android/listview/android-custom-listview-with-image-and-text-using-arrayadapter/

于 2013-05-27T16:27:37.983 回答