【问题标题】:Custom ListView in Android with icon and text not workingAndroid中的自定义ListView图标和文本不起作用
【发布时间】:2013-05-22 12:58:26
【问题描述】:

我不是 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>

【问题讨论】:

  • 请发布您的完整代码。
  • 请在此处发布错误。
  • 查看this教程。

标签: android list listview text icons


【解决方案1】:

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

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

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

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

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

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

所以,您的第一个问题是,在您的适配器上设置阵列后,您正在更改/填充阵列。你应该改变它。

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

再次,从教程中检索。

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

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

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

因此,下面的代码实现了一个自定义 listView。在每一行我们有两个文本视图和图标。看看(你可以sse完整的例子here(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();
}

}

MyAdapter.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;
}

}

【讨论】:

    【解决方案2】:

    实现起来很简单。它在我身边工作正常。 希望对你有帮助。

    创建 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>
    

    【讨论】:

      【解决方案3】:

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

      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/

      【讨论】:

      • 谢谢,2nd 链接帮了我一点忙! :D
      猜你喜欢
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多