2013-05-27 2 views
0

자바/Android의 전문가가 아니지만 여전히 작업 중입니다.아이콘과 텍스트가 작동하지 않는 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-populating-a-list-with-images-and-text/) 자습서를 확인하십시오. – bakriOnFire

답변

2

확인, 사용자 지정 목록보기를 구현하는 방법을 더 잘 이해하기 위해, 나는 당신이 tutorial을 확인 좋습니다. 자, 문제를 찾고있어. ArrayAdapter를 사용하여 동적 목록을 만들기 때문에 첫 번째 문제가 발생합니다. 튜토리얼에서 얻은 설명을 살펴보십시오. ArrayAdapter와 클래스는 입력으로 자바 객체를 처리 할 수있는 ArrayAdapter와 에 대한

입력. 이 입력 데이터를 레이아웃의 TextView에 매핑합니다. 생성자에서 하나를 정의 할 수 있습니다. 그렇지 않으면 android.R.id.text1 ID가 사용됩니다.

ArrayAdapter는 데이터 입력 객체의 toString() 메서드를 사용하여 표시 할 문자열을 결정합니다.

데이터 추가 및 제거 ArrayAdapter 클래스를 사용하면 clear() 메서드 호출을 사용하여 기본 데이터 구조의 모든 요소를 ​​제거 할 수 있습니다. 그런 다음 add() 메서드를 통해 새 요소를 추가하거나 addAll() 메서드를 통해 Collection을 추가 할 수 있습니다.

기본 데이터 구조를 직접 수정하고 어댑터의 notifyDataSetChanged() 메소드를 호출하여 데이터 변경 사항을 알릴 수도 있습니다.

경고 어댑터의 데이터를 변경하려면 기본 데이터 구조가이 작업을 지원해야합니다. 이것은 예를 들어 ArrayList 클래스의 경우이지만 배열의 경우는 아닙니다.

첫 번째 문제는 어댑터에 어댑터를 설정 한 후 배열을 변경/채우고 있기 때문입니다. 이걸 바꿔야 해.

각 줄에 아이콘을 붙이십시오. 이렇게하려면 사용자 지정 어댑터를 작성해야합니다. 예를 들어, 사용자 정의 어댑터를 확장하여이를 수행 할 수 있습니다.

다시 자습서에서 확인했습니다.

데이터 할당을 제어하고 여러 뷰에이 과제를 지원하는 사용자 정의 어댑터 을 개발, 당신은 당신의 자신의 어댑터 구현을 작성합니다. 이를 위해 기존 어댑터 구현을 확장하거나 BaseAdapter 클래스를 직접 하위 클래스로 분류합니다.

ListView는 각 데이터 요소에 대해 어댑터에서 getView() 메소드를 호출합니다. 이 메소드에서 어댑터는 행의 레이아웃과 데이터가이 레이아웃의 뷰에 맵핑되는 방식을 결정합니다.

이 레이아웃의 루트는 일반적으로 ViewGroup (LayoutManager)이며 다른 여러보기를 포함합니다. ImageView 및 TextView.

따라서 아래 코드는 사용자 지정 listView를 구현합니다. 각 줄에는 두 개의 textview 및 아이콘이 있습니다. 봐 (당신은 전체 예제 here(Example CustomListView)를 SSE 수) :

결과 :

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

고마워, * 2 * 링크가 나를 조금 도와 줬어! : D –

1

의 구현이 간단. 그 myside에서 잘 작동합니다. 희망이 있으면 도움이 될 것입니다.

<?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> 

지금 목록보기의 자바 클래스를 생성 checklist.xml :

는 XML 파일을 만듭니다.

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를 추가하십시오.

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