【问题标题】:Cannot click listview android with custom adapter无法使用自定义适配器单击 listview android
【发布时间】:2015-05-20 03:52:12
【问题描述】:

我真的是新手 android。 现在我尝试使用标题部分创建一个简单的自定义列表视图。 但是在我运行我的程序之后,listview 项目是不可点击的。 这是我的代码:

MainActivity.java

package io.hidayat.headerlistview;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;


public class MainActivity extends Activity {


    private CustomAdapter mAdapter;
    ListView listView;

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

        setContentView(R.layout.activity_main);
        listView = (ListView)findViewById(R.id.list_header_detail);

        mAdapter = new CustomAdapter(this);
        mAdapter.addSectionHeaderItem("Section #1");
        for (int i = 1; i < 30; i++) {
            mAdapter.addItem("Row Item #" + i);
            if (i % 4 == 0) {
                mAdapter.addSectionHeaderItem("Section #" + i);
            }
        }

        listView.setAdapter(mAdapter);
    }
}

CustomAdapter.java

package io.hidayat.headerlistview;

import java.util.ArrayList;
import java.util.TreeSet;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

class CustomAdapter extends BaseAdapter {

    private static final int TYPE_ITEM = 0;
    private static final int TYPE_SEPARATOR = 1;

    private ArrayList<String> mData = new ArrayList<String>();
    private TreeSet<Integer> sectionHeader = new TreeSet<Integer>();

    private LayoutInflater mInflater;

    public CustomAdapter(Context context) {
        mInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addItem(final String item) {
        mData.add(item);
        notifyDataSetChanged();
    }

    public void addSectionHeaderItem(final String item) {
        mData.add(item);
        sectionHeader.add(mData.size() - 1);
        notifyDataSetChanged();
    }

    @Override
    public int getItemViewType(int position) {
        return sectionHeader.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

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

    @Override
    public String getItem(int position) {
        return mData.get(position);
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        int rowType = getItemViewType(position);

        if (convertView == null) {
            holder = new ViewHolder();
            switch (rowType) {
            case TYPE_ITEM:
                convertView = mInflater.inflate(R.layout.row, parent, false);
                holder.textView = (TextView) convertView.findViewById(R.id.text);
                break;
            case TYPE_SEPARATOR:
                convertView = mInflater.inflate(R.layout.header, parent, false);
                holder.textView = (TextView) convertView.findViewById(R.id.textSeparator);
                break;
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.textView.setText(mData.get(position));

        return convertView;
    }

    public static class ViewHolder {
        public TextView textView;
    }

}

Header 和 Row XML 是相似的。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:descendantFocusability="blocksDescendants" >

    <TextView
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#FFF"
        android:gravity="center_vertical"
        android:padding="5dp"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#FF000000" />

</LinearLayout>

activity_main.xml

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

    <ListView
        android:id="@+id/list_header_detail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dip"
        android:paddingBottom="16dip"
        android:clipToPadding="false"
        android:divider="@null"/>   

</LinearLayout>

对不起,这里是我的应用程序的屏幕截图:screenshoot

【问题讨论】:

  • 你在哪里写了listitem点击代码?您是否尝试为列表视图设置 onItemClickListener ?
  • 实际上我还没有为点击监听器添加代码。我只是想知道为什么我触摸的列表项没有像点击一样被标记。因为当我按照this 教程触摸它标记的项目时。
  • 在您的列表中设置 onitemclicklistener 并检查 This Post 以使其正常工作。

标签: java android xml listview android-listview


【解决方案1】:

您尚未应用OnItemClickListener。那就是问题所在。不用担心。您可以查看下面的示例来根据需要更改您的代码。

首先用OnItemClickListener 来实现你的Class

public class MainActivity extends Activity implements OnItemClickListener

然后将OnItemClickListener 附加到您的list

listView.setOnItemClickListener(YourClassName.this);

然后覆盖onItemClick 方法以在被点击的position 处实现您的功能。

@Override
    public void onItemClick(AdapterView<?> adapter, View arg1, int position, long arg3) {
        // TODO Auto-generated method stub
        String item = adapter.getItemAtPosition(position).toString();
        Toast.makeText(Test.this, "CLICK: " + item, Toast.LENGTH_SHORT).show();
    }

如果您遇到任何问题,请告诉我。谢谢。

【讨论】:

  • 嗨 Shaik,您的代码适用于 ClickListener。太感谢了。但是你知道为什么我触摸的项目没有像我点击一样标记,颜色总是一样的,就像我从未点击过一样。
  • 我的荣幸。如果您满意,请接受我的回答。
  • 当然,它完成了。 :) 但请帮助我为什么我触摸的项目没有像我点击一样标记,颜色总是一样的,就像我从未点击过的项目一样。
  • 可以参考Esteam'sstackoverflow.com/questions/16976431/…中的回答
【解决方案2】:

在您的列表视图中调用以下方法

 listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Toast.makeText(MainActivity.this, "clicked", Toast.LENGTH_SHORT).show();

        }
    });

【讨论】:

  • 嗨,朵拉,感谢您的帮助,但 Shaik 给了我更多详细信息。你的回答也是帮助我。但我仍然想知道为什么该项目没有像点击一样被标记,颜色总是像从未点击过一样
【解决方案3】:

行项目必须有一个类似android:descendantFocusability="blocksDescendants". 的参数,将它用于你的行项目父级。它非常适用于具有 CustomAdapter 的列表视图。

【讨论】:

  • 嗨 RajaReddy 我已经在我的 XML 中为行项目添加了该参数。请看我附加的代码..
  • 您必须将 onItemClickListener 添加到您的列表视图中
猜你喜欢
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多