【问题标题】:setOnItemClickListener not workingsetOnItemClickListener 不工作
【发布时间】:2016-11-22 06:41:06
【问题描述】:

我的 Listview 应用程序从自定义适配器 ListAdapter.class 获取项目视图的数据和背景颜色。我还需要在 listview 下方的 textview 中设置当前选定的列表项值,但 @987654326 中的 setOnItemClickListener @ 没有执行。请帮助。

这是我的列表视图应用:

Layout image

MainActivity.java

public class MainActivity extends Activity {
private static ListAdapterclass adapter;
    ListView lv;
    TextView tv2;
    private  final String android_versions[]={
            "Donut",
            "Eclair",
            "Froyo",
            "Gingerbread",
            "Honeycomb",
            "Ice Cream Sandwich",
            "Jelly Bean",
            "KitKat",
            "Lollipop",
            "Marshmallow"
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }
    private  void initViews() {
        lv = (ListView) findViewById(R.id.listView1);
        tv2 = (TextView) findViewById(R.id.selected);

        adapter = new ListAdapterclass(getApplicationContext(), android_versions);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(getApplicationContext(), "hiiiiiiiii", Toast.LENGTH_SHORT).show();
                System.out.println("********************** INSIDE  ONITEMCLICKLISTNER IN MAIN ACTIVITY ******************");
                String ver_name = (lv.getItemAtPosition(i)).toString();


                tv2 = (TextView) findViewById(R.id.selected);
                tv2.setText(ver_name);
            }
        });
    }
}

ListAdapter.class

public class ListAdapterclass extends ArrayAdapter implements AdapterView.OnItemClickListener{

    private String android_versionNames[];
    Context mContext;
    public int row_index=-1;

    @Override
    public void onItemClick(AdapterView<?> adapterView, View v, int i, long l) {
        int position=(Integer)v.getTag();
        String ver_name=getItem(position).toString();
    }

    private static class ViewHolder{
        TextView tv;
       LinearLayout LL;
        TextView tv2;
    }



    public ListAdapterclass(Context context,String android_versionnames[]) {
        super(context, R.layout.list_item,android_versionnames);
        this.android_versionNames=android_versionnames;
        this.mContext=context;

        System.out.println(" ????????????????????????  Inside dataadapter,Android names :  ?????????????????????????????\n  ");
        for(int i=0;i<android_versionnames.length;i++){
            System.out.println("\n"+android_versionnames[i]);
        }

    }
    private int lastPosition=-1;

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

        String ver_name=getItem(position).toString();

        final ViewHolder viewHolder;
        final View result;

        if(convertView==null){
            viewHolder=new ViewHolder();
            LayoutInflater inflater=LayoutInflater.from(getContext());
            convertView=inflater.inflate(R.layout.list_item,parent,false);
            viewHolder.tv=(TextView)convertView.findViewById(R.id.label);
            viewHolder.LL=(LinearLayout) convertView.findViewById(R.id.linearLayout_1);
            viewHolder.tv2=(TextView)convertView.findViewById(R.id.selected);
            result=convertView;
            convertView.setTag(viewHolder);
        }else{
            viewHolder=(ViewHolder) convertView.getTag();
            result=convertView;
        }
        lastPosition=position;

        viewHolder.tv.setText(ver_name);

        viewHolder.LL.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                row_index=position;
                notifyDataSetChanged();
            }
        });
        if(row_index==position){
            viewHolder.LL.setBackgroundColor(Color.parseColor("#409de1"));
            viewHolder.tv.setTextColor(Color.parseColor("#ffffff"));
        }
        else
        {
            viewHolder.LL.setBackgroundColor(Color.parseColor("#ffffff"));
            viewHolder.tv.setTextColor(Color.parseColor("#000000"));

        }
        return convertView;
    }
}

ActivityMain.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
android:orientation="vertical"
    tools:context="com.cybraum.test.listviewcolorchange.MainActivity"
    >
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="0dp"
android:clickable="true"
    android:layout_weight="1"
    >
 <ListView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:id="@+id/listView1"
     >
 </ListView>


</LinearLayout>

 <LinearLayout
     android:layout_width="match_parent"
     android:layout_height="0dp"
     android:layout_weight=".2"
     android:id="@+id/linearLayout_2"
     android:orientation="horizontal"

     >
  <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Selected : "
      android:textStyle="bold"
      android:layout_gravity="center"/>
  <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:textStyle="bold"
      android:text="text"
      android:id="@+id/selected"
      android:layout_gravity="center"/>

 </LinearLayout>

</LinearLayout>

listitem.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:id="@+id/linearLayout_1"
    android:padding="10dp">
<TextView
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dip"
    android:textSize="16dip"
    android:textStyle="bold"
    android:textColor="#000000"
    android:gravity="center">
</TextView>
</LinearLayout>

有什么问题?

【问题讨论】:

  • 发布您的适配器项目 xml
  • 点击项目时日志中发生的情况。日志中打印任何内容
  • 删除适配器中的 viewHolder.LL.setOnClickListener ,然后检查它是否采用 onItemClickListener?
  • 我已经添加了 xml 文件..
  • 是的。当我删除 viewHolder.LL.setOnClickListener 时它起作用了..但我也需要那个..怎么办???????

标签: java android xml listview onclicklistener


【解决方案1】:

从适配器中移除 viewHolder.LL.setOnClickListener 监听器并 在您的适配器中添加一个更新 row_index 的方法:

public void changeIndex(int rowIndex){
this.row_index = rowIndex;
notifyDataSetChanged();
}

从 onItemClickListener 事件调用此方法:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
adapter.changeIndex(i);//This will give you the same result of viewHolder.LL.setOnClickListener as you are doing
                //Do whatever you are doing previously
            }
        }); 

【讨论】:

    【解决方案2】:

    如果您从适配器获取点击事件,则如果您需要适配器点击事件和列表视图项目点击,则 listview itemclick 无法工作,请参考链接, How to make imageView clickable from OnItemClickListener?

      @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        long viewId = view.getId();
    
        if (viewId == R.id.button1) {
            Toast.makeText(this, "Button 1 clicked", Toast.LENGTH_SHORT).show();
        } else if (viewId == R.id.button2) {
            Toast.makeText(this, "Button 2 clicked", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "ListView clicked" + id, Toast.LENGTH_SHORT).show();
        }
    }
    

    在适配器中:

    viewHolder.Btn.setOnClickListener(new OnClickListener() {
    
    @Override
    public void onClick(View v) {
    ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick()
    }
    

    【讨论】:

      【解决方案3】:

      用途:

       lv.setOnItemClickListener(new OnItemClickListener() {
                  @Override
                  public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                      Toast.makeText(getApplicationContext(), "hiiiiiiiii", Toast.LENGTH_SHORT).show();
                      System.out.println("********************** INSIDE  ONITEMCLICKLISTNER IN MAIN ACTIVITY ******************");
                      String ver_name = (lv.getItemAtPosition(i)).toString();
      
      
                      tv2 = (TextView) findViewById(R.id.selected);
                      tv2.setText(ver_name);
                  }
              });
      

      然后从适配器中移除

      实现 AdapterView.OnItemClickListener

      【讨论】:

      • 查看上面可能对您有用的答案,因为我们可以从 Listview 中获取 onClicke vent 和 itemclick
      【解决方案4】:

      您需要从setOnClickListner() 中移除您的适配器 尝试用

      改变你的方法
      listView.setOnItemClickListener(new OnItemClickListener() {
          public void onItemClick(AdapterView<?> parent, View view,
                  int position, long id) {
         Object o = prestListView.getItemAtPosition(position);
         prestationEco str=(prestationEco)o;//As you are using Default String Adapter
         Toast.makeText(getBaseContext(),str.getTitle(),Toast.LENGTH_SHORT).show();
          }
      });
      

      【讨论】:

        【解决方案5】:

        更改列表视图 xml

        <ListView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:clickable="true"
                android:focusable="true"></ListView>
        

        从适配器类中移除 AdapterView.OnItemClickListener

        公共类 ListAdapterclass 扩展 ArrayAdapter {

        }

        【讨论】:

          【解决方案6】:

          更改列表视图 xml

              <ListView
          
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:clickable="true"   
                   android:focusable="true">
          
           </ListView>
          

          从适配器类中移除 AdapterView.OnItemClickListener

          公共类 ListAdapterclass 扩展 ArrayAdapter {

          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-07
            • 1970-01-01
            相关资源
            最近更新 更多