android - Android Studio 中带有自定义适配器的自定义 ListView

标签 android listview custom-adapter

请问我不知道是什么问题。没有任何错误,程序 工作完美。但是,当我单击 ListView 中的某个项目时,它不会执行任何操作。换句话说,“ toast ”不会通过

这是我的主要类(class):

public class ViewListAct extends ActionBarActivity {


private ListView list;
private final String[] names_1 = {"McDonald's", "Subway", "Pizza Hut", "Burger King"};
private final String[] img_1   = {"mcd", "mcd", "mcd", "mcd"};
private Activity context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view_list);
    list = (ListView) findViewById(R.id.listview);

    AdapterView adapter = new AdapterView(this, img_1, names_1);
    list.setAdapter(adapter);


      list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(android.widget.AdapterView<?> parent, View view, int position, long id) {
           Toast.makeText(getApplicationContext(), names_1[position], Toast.LENGTH_LONG).show();


        }
    });

}

这是我的自定义适配器类:

public class AdapterView extends ArrayAdapter<String> {

    private Activity context_1;
    private String[] names_1;
    private String[] img_1;

public AdapterView(Activity context, String[] img, String[] names) {
    super(context, R.layout.pic_letf_tv_right, names);

    context_1 = context;
    this.names_1 = names;
    this.img_1 = img;
}

public View getView(int position, View view, ViewGroup parent){
    LayoutInflater l_i_f = context_1.getLayoutInflater();
    View rv = l_i_f.inflate(R.layout.pic_letf_tv_right, null); 

    TextView tv_l = (TextView) rv.findViewById(R.id.tv_view);
    tv_l.setText(names_1[position]);

    ImageView imageView = (ImageView) rv.findViewById(R.id.log_img);
    int id = context_1.getResources().getIdentifier(img_1[position], "drawable", context_1.getPackageName());
    imageView.setImageResource(id);

    return rv;
}

这是我的自定义行 xml 文件:

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

    <ImageView
    android:layout_width="500px"
    android:layout_height="500px"
    android:id="@+id/log_img"
    />

    <TextView
    android:id="@+id/tv_view"
    android:layout_gravity="center"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="500px"
    android:textColor="#FFFFFF"
    android:textSize="18dp"/>
    </LinearLayout>

这是我的 ListView xml 文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="always"
tools:context=".ViewList">



<ListView
    android:id="@+id/listview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scrollingCache="false"
    android:smoothScrollbar="true"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:background="#000000" />

谁能告诉我我做错了什么。

最佳答案

首先使用ViewHolder 模式。第二次扩展 BaseAdapter 而不是 AdapterView。第三步从 row.xml 中删除 android:clickable="true"。可点击状态必须在方法 onItemClickListener 中有 ListView,而不是自己的行。

已更新

对于自定义 ListView ,您可以使用 BaseAdapter。

对于 Adapter Class,你有一些技巧可以让它变得流畅,为此你可以引用 this

它还与已创建行的控件实例的可重用性有关。对于 ViewHolder 模式,我更喜欢使用它来保存对象。请查看this更多详情

适配器的 getView 方法的代码中缺少它。

有关更多解释,我在 Adapter 的 getView 方法中发表评论。

如果您要使用 thn 命名约定,则保存详细信息的类应该是正确的 这里首先名称是“对象”,这是错误的。

Activity

private ListView list;
    private final ArrayList<RestaurantsDetails> pairs = new ArrayList<RestaurantsDetails>();
    private Activity context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        pairs.add(new RestaurantsDetails("McDonald's", "mcd"));
        pairs.add(new RestaurantsDetails("Subway", "mcd"));
        pairs.add(new RestaurantsDetails("Pizza Hut", "mcd"));
        pairs.add(new RestaurantsDetails("Burger King", "mcd"));

        list = (ListView) findViewById(R.id.listview);

        AdapterViewCustom adapter = new AdapterViewCustom(this, pairs);
        list.setAdapter(adapter);

        list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(android.widget.AdapterView<?> parent,
                    View view, int position, long id) {
                Toast.makeText(getApplicationContext(),
                        pairs.get(position).name, Toast.LENGTH_LONG).show();
            }
        });

    }

数据层类

/**
     * Use proper name For the class. Should not use the name like "Object" or
     * the class which is already used by framework
     * 
     */
    public class RestaurantsDetails {

        public String name;
        public String img;

        public RestaurantsDetails(String name, String img) {
            this.name = name;
            this.img = img;
        }

    }

适配器

public class AdapterViewCustom extends BaseAdapter {

        private Activity context_1;

        private ArrayList<RestaurantsDetails> pairs;

        public AdapterViewCustom(Activity context,
                ArrayList<RestaurantsDetails> pairs) {
            context_1 = context;
            this.pairs = pairs;
        }

        @Override
        public int getCount() {
            return pairs.size();
        }

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

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

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

            if (convertView == null) {
                convertView = LayoutInflater.from(context_1).inflate(
                        R.layout.custom_row, null);
                viewHolder = new ViewHolder();
                viewHolder.img = (ImageView) convertView
                        .findViewById(R.id.log_img);
                viewHolder.txt = (TextView) convertView
                        .findViewById(R.id.tv_view);
                /**
                 * At very first time when the List View row Item control's
                 * instance is created it will be store in the convertView as a
                 * ViewHolder Class object for the reusability purpose
                 **/
                convertView.setTag(viewHolder);
            } else {
                /**
                 * Once the instance of the row item's control it will use from
                 * already created controls which are stored in convertView as a
                 * ViewHolder Instance
                 * */
                viewHolder = (ViewHolder) convertView.getTag();
            }

            viewHolder.txt.setText(pairs.get(position).name);
            int id = context_1.getResources().getIdentifier(
                    pairs.get(position).img, "drawable",
                    context_1.getPackageName());
            viewHolder.img.setImageResource(id);

            return convertView;
        }

        public class ViewHolder {
            public final ImageView img;
            public final TextView txt;

        }
    }

关于android - Android Studio 中带有自定义适配器的自定义 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28406084/

相关文章:

java - 交换列表中的项目后,自定义列表适配器和 ViewHolder 模式出现问题

java - 该方法在 ListView 中应用了错误的元素

android - 如何禁用 ListView 中的先前项目

android - 如何在 Android 上禁用日期时间设置?

android - 如何在应用程序内更改语言(区域设置)后刷新 Activity

android - Xamarin 表格 : Write a file in Android device's internal storage

listview - 对话框中的 ListView ,适合文本

android - 单击通知时启动自定义对话框

javascript - 如何在android中单击时将选定的行图标替换为列表项上的另一个图标

jquery - 当我在 JqueryMobile 中单击时如何在 ListView 上添加颜色