按钮未显示在android的自定义列表视图中

Posted

技术标签:

【中文标题】按钮未显示在android的自定义列表视图中【英文标题】:Button not showing in the custom listview of android 【发布时间】:2015-05-21 04:11:02 【问题描述】:

我已经使用 ArrayAdapter 创建了自定义 Listview。下面是我的代码

adapter = new ArrayAdapter<Item>(this,
                android.R.layout.activity_list_item, android.R.id.text1,
                fileList) 
            @Override
            public View getView(int position, View convertView, ViewGroup parent) 
                // creates view
                View view = super.getView(position, convertView, parent);
                TextView textView = (TextView) view
                        .findViewById(android.R.id.text1);

                // put the image on the text view
                textView.setCompoundDrawablesWithIntrinsicBounds(
                        fileList[position].icon, 0, 0, 0);

                // add margin between image and text (support various screen
                // densities)
                int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f);
                textView.setCompoundDrawablePadding(dp5);

                Button b1 = (Button)findViewById(android.R.id.button1);

                return view;
            
        ;

在上面的代码中按钮没有显示。如何显示带有 textview 和 image 的按钮。

谢谢

【问题讨论】:

最好使用自定义适配器。 【参考方案1】:

this 更改为get activity()getBaseContext

adapter = new ArrayAdapter<Item>(getActivity(),
                android.R.layout.activity_list_item, android.R.id.text1,
                fileList)

【讨论】:

这之间没有任何联系。【参考方案2】:

这里的问题是您使用 android 的 textview ""android.R.id.text1"" 并在 Arraylist 适配器中设置,因此您只能获得 Textview,因为您在适配器的 getview() 方法中返回视图

为按钮创建自定义视图。

创建xml文件cstom.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/textView1"
        android:layout_
        android:layout_
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <Button
        android:id="@+id/button1"
        android:layout_
        android:layout_
        android:text="Button" />

</LinearLayout>

创建您的自定义适配器类

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;

public class MyCustomAdapter extends BaseAdapter 
    private LayoutInflater inflater;
    private ArrayList<String> list;
    public MyCustomAdapter(Context context, ArrayList<String> list) 
        inflater=LayoutInflater.from(context);
        this.list=list;
    

    @Override
    public int getCount() 
        // TODO Auto-generated method stub
        return list.size();
    

    @Override
    public Object getItem(int position) 
        // TODO Auto-generated method stub
        return position;
    

    @Override
    public long getItemId(int position) 
        // TODO Auto-generated method stub
        return 0;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        // creates view

        View view = inflater.inflate(R.layout.cstom, null);
        Button b1 = (Button) view.findViewById(android.R.id.button1);
        TextView textView = (TextView) view.findViewById(android.R.id.textView1);
        return view;

    

从您的活动中设置

MyCustomAdapter adapter=new MyCustomAdapter(context,list);
listview.setAdapter(adapter);

【讨论】:

【参考方案3】:

您的代码已经是一个自定义适配器,但最好为此创建一个单独的类。无论如何,对于一个完善的代码,缺少holder。看看它是如何做到的:

adapter = new ArrayAdapter<Item>(this,
                android.R.layout.activity_list_item, android.R.id.text1,
                fileList) 

            private ViewHolder mHolder;

            private static class ViewHolder 

                TextView textView;
                Button b1;

            

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

                if (view == null) 

                    mHolder = new ViewHolder();

                    LayoutInflater _layoutInflater = (LayoutInflater) mContext.getSystemService(
                            Context.LAYOUT_INFLATER_SERVICE);

                    view = _layoutInflater.inflate(R.layout.custom, null);

                    mHolder.textView = (TextView) view.findViewById(R.id.text1);
                    mHolder.b1 = (Button) view.findViewById(R.id.button1);

                    view.setTag(mHolder);

                
                else

                    mHolder = (ViewHolder) view.getTag();

                

                // put the image on the text view
                mHolder.textView.setCompoundDrawablesWithIntrinsicBounds(
                        fileList[position].icon, 0, 0, 0);

                // add margin between image and text (support various screen
                // densities)
                int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f);
                mHolder.textView.setCompoundDrawablePadding(dp5);

                mHolder.b1.setOnClickListener(new View.OnClickListener() 

                    @Override
                    public void onClick(View v) 

                    

                );

                return view;
            
        ;

【讨论】:

以上是关于按钮未显示在android的自定义列表视图中的主要内容,如果未能解决你的问题,请参考以下文章

如何将最新数据附加到android中的自定义基本适配器列表视图?

如何设计WinForm中DataGridView控件的自定义按钮列

如何删除android中的自定义列表视图项?

当按下 menuItem 以在 android 中显示用于列表视图的自定义适配器时,应用程序崩溃

在android中自定义评分栏

自定义列表视图未出现在对话框中