2013-05-27 3 views
0

im не эксперт в Java/Android, но я все еще работаю над этим.Пользовательский ListView в Android с иконкой и текстом не работает

Я просто хотел узнать вас, чтобы создать пользовательский ListView с иконкой и текстом.

список (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> 
+0

Пожалуйста, разместите свой полный код. –

+0

Пожалуйста, разместите здесь ошибку. – AndyFaizan

+0

проверьте [this] (http://intransitione.com/blog/advanced-listview-population-a-list-with-images-and-text/) учебник. – bakriOnFire

ответ

2

Хорошо, чтобы лучше понять, как реализовать пользовательский ListView, я советую вам проверить это tutorial. Теперь, ища вашу проблему. Первая проблема возникает из-за того, что вы используете ArrayAdapter для создания динамического списка. Взгляните на это объяснение, извлеченное из учебника.

Вход для ArrayAdapter Класс ArrayAdapter может обрабатывать любой объект Java в качестве входных данных. Он отображает данные этого ввода в TextView в макете. Вы можете определить его в конструкторе, иначе будет использоваться идентификатор android.R.id.text1.

ArrayAdapter использует метод toString() объекта ввода данных для определения строки, которая должна отображаться.

добавлять и удалять данные Класс ArrayAdapter позволяет удалить все элементы в его основной структуры данных с четким() вызова метода. Затем вы можете добавлять новые элементы с помощью метода add() или коллекции через метод addAll().

Вы также можете напрямую изменить базовую структуру данных и вызвать метод notifyDataSetChanged() на адаптере, чтобы уведомить его об изменениях в данных.

Предупреждение Если вы хотите изменить данные в своем адаптере, базовая структура данных должна поддерживать эту операцию. Это, например, случай для класса ArrayList, но не для массивов.

Итак, ваша первая проблема заключается в том, что вы меняете/заполняете свой массив после установки его на свой адаптер. Вы должны это изменить.

Оставьте значок на каждой строке. Для этого вы должны написать собственный адаптер. Например, вы можете расширить пользовательский адаптер для этого.

Опять же, извлечено из учебника.

Разработка пользовательского адаптера Чтобы контролировать назначение данных и поддерживать это задание нескольким Views, вы создаете свою собственную реализацию адаптера. Для этого вы должны расширить существующие реализации адаптеров или подклассифицировать класс BaseAdapter напрямую.

ListView вызывает метод getView() для адаптера для каждого элемента данных. В этом методе адаптер определяет макет строки и как данные сопоставляются с представлениями в этом макете.

Этот корень макета, как правило, представляет собой ViewGroup (LayoutManager) и содержит несколько других представлений, например. ImageView и TextView.

Итак, приведенный ниже код реализует пользовательский listView. На каждой строке у нас есть два текста и значок. Посмотрите (Вы можете ße полный пример here(Example CustomListView)):

Результат:

Final Result

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

} 
+0

Спасибо всем, кто пытался мне помочь! –

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/

+0

Спасибо, ссылка * 2nd * помогла мне немного! : D –

1

ее простой в реализации. его работая отлично в myside. Надеюсь, это поможет вам.

создать файл 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> 

Создать класс Java для ListView.

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 в моем случае.

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> 
Смежные вопросы