1

私はJava/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>
4

3 に答える 3

4

わかりました、カスタムリストビューを実装する方法をよりよく理解するには、このチュートリアルを確認することをお勧めします. 今、あなたの問題を探しています。最初の問題は、ArrayAdapter を使用して動的リストを作成しているためです。チュートリアルから取得した説明を見てください。

ArrayAdapter の入力 ArrayAdapter クラスは、任意の Java オブジェクトを入力として処理できます。この入力のデータをレイアウトの TextView にマップします。コンストラクターで定義できます。そうしないと、android.R.id.text1 ID が使用されます。

ArrayAdapter は、データ入力オブジェクトの toString() メソッドを使用して、表示する String を決定します。

データの追加と削除 ArrayAdapter クラスでは、clear() メソッド呼び出しを使用して、基礎となるデータ構造内のすべての要素を削除できます。次に、add() メソッドを介して新しい要素を追加するか、addAll() メソッドを介してコレクションを追加できます。

基になるデータ構造を直接変更し、アダプターで notifyDataSetChanged() メソッドを呼び出して、データの変更について通知することもできます。

警告 アダプタのデータを変更する場合は、基になるデータ構造がこの操作をサポートしている必要があります。これは、たとえば ArrayList クラスの場合に当てはまりますが、配列の場合には当てはまりません。

したがって、最初の問題は、アダプターに設定した後に配列を変更/入力していることです。これを変更する必要があります。

各行にアイコンを配置します。これを行うには、カスタム アダプターを作成する必要があります。たとえば、カスタム アダプタを拡張してそれを行うことができます。

繰り返しますが、チュートリアルから取得します。

カスタム アダプタの開発 データ割り当てを制御し、複数のビューへのこの割り当てをサポートするには、独自のアダプタ実装を作成します。このために、既存のアダプタの実装を拡張するか、BaseAdapter クラスを直接サブクラス化します。

ListView は、データ要素ごとにアダプタの getView() メソッドを呼び出します。このメソッドでは、アダプタが行のレイアウトと、このレイアウトのビューにデータをマップする方法を決定します。

レイアウトのこのルートは通常、ViewGroup (LayoutManager) であり、ImageView や TextView などの他のいくつかのビューが含まれています。

したがって、以下のコードはカスタム listView を実装しています。各行には、2 つのテキストビューとアイコンがあります。見てみましょう(ここで完全な例を参照できます(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;
}

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

リストビュー用の 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 という名前のアクティビティです。

    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 に答える