2016-07-23 75 views
2

我想制作一个应用程序图标列表并将其显示在listView中。我已经在ArrayList变量array中存储了包名称。使用此代码:如何使用ArrayAdapter在ListView中设置可绘制变量android

Drawable icon=getPackageManager().getApplicationLogo(array.toString());

和存储drawable变量icon所有的图标。现在我想设置的变量iconArrayAdapter,才能在listview。但是,以显示它,我不知道该怎么办它可以帮助我..

+0

你有一个适配器此列表中的图标?如果是这样,发布您的代码 –

+0

不,我还没有创建它 – Adarsh

+0

@Kurlicue我知道如何使适配器为ArrayAdapter 但不适用于任何可绘制对象的ArrayAdapter – Adarsh

回答

1

如果你想使你的列表视图元素动态的,例如与图像&包名,创建对象类:

public class AppIcon { 

    private Drawable mDrawable; 

    private String mPackageName; 

    public AppIcon(Drawable drawable, String packageName) { 
     this.mDrawable = drawable; 
     this.mPackageName = packageName; 
    } 

    public Drawable getmDrawable() { 
     return mDrawable; 
    } 

    public String getmPackageName() { 
     return mPackageName; 
    } 
} 

创建以下自定义RecyclerView adapter

public class ImageArrayAdapter extends RecyclerView.Adapter<ImageArrayAdapter.ViewHolder> { 

    /** 
    * list of devices 
    */ 
    private List<AppIcon> imageList = new ArrayList<>(); 

    private Context mContext; 

    private IViewHolderClickListener mListener; 

    public ImageArrayAdapter(Context context, List<AppIcon> objects, IViewHolderClickListener listener) { 
     this.mContext = context; 
     this.imageList = objects; 
     this.mListener = listener; 
    } 

    @Override 
    public ImageArrayAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View inflater = LayoutInflater.from(parent.getContext()).inflate(R.layout.listview_item, parent, false); 
     return new ViewHolder(inflater, mListener); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     AppIcon item = imageList.get(position); 

     holder.image.setImageDrawable(item.getmDrawable()); 
     holder.packageName.setText(item.getmPackageName()); 
    } 

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

    @Override 
    public int getItemCount() { 
     return imageList.size(); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

     public ImageView image; 

     public TextView packageName; 

     public IViewHolderClickListener mListener; 

     /** 
     * ViewHolder 
     * 
     * @param v 
     * @param listener 
     */ 
     public ViewHolder(View v, IViewHolderClickListener listener) { 
      super(v); 
      mListener = listener; 
      image = (ImageView) v.findViewById(R.id.image); 
      packageName = (TextView) v.findViewById(R.id.package_name); 
      v.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      mListener.onClick(v); 
     } 
    } 
} 

这是更好要使用RecyclerView,特别是在处理大量图像时。

build.gradle

compile 'com.android.support:appcompat-v7:24.0.0' 
compile 'com.android.support:recyclerview-v7:+' 

你可以看到ViewHolder握着你的所有嵌套字段在您的列表视图项目,将与太调度click事件:

public interface IViewHolderClickListener { 

    void onClick(View v); 
} 

在你的活动,创建您的适配器和将其设置为适配器的RecyclerView。此外,随着图像列表初始化适配器:

public class DescriptionActivity extends Activity { 

    private RecyclerView imageRecyclerView = null; 

    private ImageArrayAdapter imageAdapter = null; 

    private SwipeRefreshLayout mSwipeRefreshLayout; 

    private ArrayList<AppIcon> imageList; 

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

     //setup recyclerview 
     imageRecyclerView = (RecyclerView) findViewById(R.id.image_list); 

     imageList = new ArrayList<>(); 

     try { 
      Drawable icon = getPackageManager().getApplicationIcon(getPackageName()); 
      imageList.add(new AppIcon(icon, getPackageName())); 
     } catch (PackageManager.NameNotFoundException e) { 
      e.printStackTrace(); 
     } 

     imageAdapter = new ImageArrayAdapter(DescriptionActivity.this, imageList, new IViewHolderClickListener() { 

      @Override 
      public void onClick(View v) { 

       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(DescriptionActivity.this, "click on item detected", Toast.LENGTH_SHORT).show(); 
        } 
       }); 
      } 
     }); 

     //set layout manager 
     imageRecyclerView.setLayoutManager(new GridLayoutManager(this, 1, LinearLayoutManager.VERTICAL, false)); 

     imageRecyclerView.setAdapter(imageAdapter); 

     //setup swipe refresh 
     mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swiperefresh); 

     mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         //refresh list here 
         imageAdapter.notifyDataSetChanged(); 
         mSwipeRefreshLayout.setRefreshing(false); 
        } 
       }); 
      } 
     }); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
    } 

} 

activity.xml样子:

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

    <android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/swiperefresh" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/image_list" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scrollbars="vertical" /> 

    </android.support.v4.widget.SwipeRefreshLayout> 

</FrameLayout> 

listview_item.xml包含每个图像/包名列表视图项的布局:

<ImageView 
    android:id="@+id/image" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:scaleType="center" 
    android:layout_weight="0.5" /> 

<TextView 
    android:id="@+id/package_name" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.5" 
    android:fontFamily="sans-serif" 
    android:textSize="18sp" /> 

另外,还要注意optionnaly我添加了一个SwipeRefreshLayout刷卡刷新列表视图中的材料的风格

+1

你可以传递一个drawable的id吗? – Eenvincible

+0

感谢兄弟,我一定会试试看,并告诉你结果 – Adarsh

+0

@Eenvincible是的,如果有一个'int'而不是存储'Drawable'会更好,但如果操作者想从其他应用中获取图标,似乎很难获得这些 –

0

绘项目只是整数值。因此,不使用Drawable类,您可以使用ArrayList数组来存储绘图。

ArrayList<Integer> list = {R.drawable.icon1, R.drawable.icon2}; 

然后你就可以获取使用

getResources().getDrwawable(list.get(iconIndex)); 

希望这能解决你的问题

相关问题