【问题标题】:How to add an icon to a listview in a fragment如何将图标添加到片段中的列表视图
【发布时间】:2013-12-11 14:57:37
【问题描述】:

我在片段中创建了一个列表视图。现在我需要向列表视图项添加一个简单的图标。每个项目上的图标必须相同。这将是一个简单的箭头 (imageview)。 我制作的列表视图可以做到这一点吗?如果是,我该怎么做?

所以像这样的格式: 我的文字在这里 --空格--空格-- >


片段代码:

  public class BiblioFragment extends Fragment {

final String[] items = new String[] { "Astma en alcohol", "Astma en huisdieren", "Astma en lichaamsgewicht",
        "Astma en ouder worden", "Astmamedicatie", "Bekende mensen met astma", "Longfunctieonderzoek", "Reizen en vakantie",
   "Sociaal leven", "Weetjes over astma", "Enzovoort", "Enzovoort", "Enzovoort" };

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_biblio, container, false);

    ListView list = (ListView)view.findViewById(R.id.listView1);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, items);
    list.setAdapter(adapter);

    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            Log.v("TAG", "CLICKED row number: " + arg2);

            Intent myIntent = new Intent(getActivity(), BiblioDetail.class);
            myIntent.putExtra("welkerij", arg2);
            startActivity(myIntent); 

        }

    });

    return view;

   }
  }

我的那个片段的 XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" 
  android:background="#ffffff">

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" >
</ListView>

</LinearLayout>

【问题讨论】:

  • 使用自定义适配器扩展自定义布局。
  • 您需要使用自定义适配器,请参阅 [此处][1] [1]:stackoverflow.com/a/8166802/2675669
  • 没有别的办法了吗?因为这似乎很难改变。
  • @user2883477 它不难改变。它实际上更容易

标签: android android-listview android-adapter


【解决方案1】:

onCreateView

ListView list = (ListView)view.findViewById(R.id.listView1);
CustomAdapter cus = new CustomAdapter(getActivity(),items);   
list.setAdapter(cus);

使用自定义适配器

public class CustomAdapter extends BaseAdapter {

    String items[];
    LayoutInflater mInflater;

    public CustomAdapter(Context context, String[] items) {
        mInflater = LayoutInflater.from(context);
        this.items = items;
    }

    @Override
    public int getCount() {
        return items.length;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if(convertView ==null)
        {
            convertView = mInflater.inflate(R.layout.list_item,parent,false);
            holder = new ViewHolder();
            holder.tv = (TextView) convertView.findViewById(R.id.textView1);
            holder.iv = (ImageView) convertView.findViewById(R.id.imageView1);
            convertView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) convertView.getTag(); 
        }
        holder.tv.setText(items[position]) 
            // use holder.iv to set whatever image you want according to the position
        return convertView;
    }

    static class ViewHolder
    { 
        ImageView iv;
        TextView tv;
    }
}

list_item.xml

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

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="42dp"
        android:layout_marginTop="32dp"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/imageView1"
        android:layout_marginLeft="64dp"
        android:layout_marginTop="14dp"
        android:layout_toRightOf="@+id/imageView1"
        android:text="TextView" />

</RelativeLayout>

捕捉

编辑:

如果你觉得这太过分了,你可以使用一个复合文本视图,左边是图像,右边是文本。

在上面我使用了list_item.xml,这是一个自定义布局。我在自定义适配器的getView 中扩展了该布局。我将文本设置为 textview。我已将默认启动器图标设置为 imageview。你可以改变它。

我也使用了 ViewHolder

http://developer.android.com/training/improving-layouts/smooth-scrolling.html

还要检查

How ListView's recycling mechanism works

【讨论】:

  • 这有点奏效。只有我在每个项目上都得到“TextView”。例如,不是 Astma en Alcohol。
  • @user2883477 将holder.tv.setTag(items[position]); 更改为holder.tv.setText(items[position]); 并在有帮助的情况下接受答案
  • 工作。谢谢!快速提问:如何在我的开篇文章中添加意图等?
  • @user2883477 你想什么时候开始一个新的活动
  • @Annie 我建议您使用相关代码 sn-ps 发布一个新问题
【解决方案2】:

创建ListAdapter

public class ListAdapter extends ArrayAdapter<Item> {

public ListAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);
    // TODO Auto-generated constructor stub
}

private List<Item> items;

public ListAdapter(Context context, int resource, List<Item> items) {

    super(context, resource, items);

    this.items = items;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = convertView;

    if (v == null) {

        LayoutInflater vi;
        vi = LayoutInflater.from(getContext());
        v = vi.inflate(R.layout.itemlistrow, null);

    }

    Item p = items.get(position);

    if (p != null) {


        ImageView ICon = ( ImageView) v.findViewById(R.id.description);




        }
    }

    return v;

}

在您的活动中

ListView yourListView = (ListView) findViewById(R.id.itemListView);

// get data from the table by the ListAdapter
ListAdapter customAdapter = new ListAdapter(this, R.layout.itemlistrow, List<yourItem>);

yourListView .setAdapter(customAdapter);

【讨论】:

  • 我可以在我的片段中实现这个吗?
  • 是的,你可以在片段中实现它
  • 这确实看起来有点矫枉过正。我让所有东西都在运行,只是想在每一行中添加相同的图标。我不能只是: ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, items);将 Imageview 放在 simple_list_item_1 中?必须有一个更简单的解决方案..
  • @user2883477 这不是过度杀戮。这就是你需要这样做的方式。除了你可以使用复合文本视图。完整答案见我的帖子
  • @user2883477 也发布了快照
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多