不能点击的ListView中的项目与自定义适配器 [英] Can't click on items in ListView with custom adapter

查看:139
本文介绍了不能点击的ListView中的项目与自定义适配器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图写一个应用程序,它从数据库中需要的物品并填充一个ListView内的行。轻敲行后,我不能点击的项目和DPAD不会去任何行任。我使用的是自定义的适配器。

Tweet.xml

 < XML版本=1.0编码=UTF-8&GT?;
    < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =机器人:ATTR /列表preferredItemHeight
        机器人:填充=6dip
        机器人:方向=垂直>

        <的LinearLayout
            机器人:layout_width =FILL_PARENT
            机器人:layout_height =WRAP_CONTENT
            机器人:方向=横向>

            <的TextView
                机器人:ID =@ + ID / textUser
                机器人:layout_width =WRAP_CONTENT
                机器人:layout_height =WRAP_CONTENT
                机器人:TEXTSTYLE =黑体
                机器人:文本=NAME/>

            <的TextView
                机器人:ID =@ + ID / textDate
                机器人:layout_width =WRAP_CONTENT
                机器人:layout_height =WRAP_CONTENT
                机器人:文字颜色=#333333
                机器人:文本=DATE/>

        < / LinearLayout中>

        <的TextView
            机器人:ID =@ + ID / textTweet
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =WRAP_CONTENT
            机器人:文本=鸣叫/>

    < / LinearLayout中>
 

Activity_main.xml

 < XML版本=1.0编码=UTF-8&GT?;
< ListView控件的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:工具=htt​​p://schemas.android.com/tool​​s
    机器人:ID =@ + ID / ListView控件
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:layout_alignParentLeft =真
    机器人:layout_alignParentTop =真
    工具:上下文=MainActivity。>

< / ListView控件>
 

onCreate方法

  @覆盖
保护无效的onCreate(包savedInstanceState)
{
            super.onCreate(savedInstanceState);
            的setContentView(R.layout.activity_main);
            ListView的视图=(ListView控件)findViewById(R.id.listView);
        MyArrayAdapter theAdapter =新MyArrayAdapter(tweetDb,这一点);

        //setContentView(theAdapter.getView(0,NULL,NULL));
        view.setAdapter(theAdapter);
        view.setOnItemClickListener(新OnItemClickListener()
        {

            @覆盖
            公共无效onItemClick(适配器视图<>母公司,视图V,INT位置,
                    长ID)
            {
                //分享Tweet theTweet =(鸣叫)parent.getAdapter()的getItem(位置)。
                //saved.insert(theTweet);
                Toast.makeText(getApplicationContext(),拯救,Toast.LENGTH_LONG).show();
                Log.v(纲目,onItemClick被解雇了!);
            }
        });
    }
 

适配器类getView

  @覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup)
{
    LayoutInflater充气=(LayoutInflater)context.getSystemService(
    Context.LAYOUT_INFLATER_SERVICE
    );

    查看tweetView = inflater.inflate(R.layout.tweet,NULL);

    TextView的textTweet =(TextView中)tweetView.findViewById(R.id.textTweet);
    textTweet.setText(items.get(位置).getTweet());

    textTweet =(TextView中)tweetView.findViewById(R.id.textUser);
    textTweet.setText(items.get(位置).getName());

    textTweet =(TextView中)tweetView.findViewById(R.id.textDate);
    textTweet.setText(textFormat.format(items.get(位置).getCreated()));

    返回tweetView;
}
 

MyArrayAdapter类

 进口java.text.SimpleDateFormat的;
进口的java.util.ArrayList;
进口java.util.Date;

进口android.content.Context;
进口android.database.Cursor;
进口android.database.DataSetObserver;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.view.ViewGroup;
进口android.widget.ListAdapter;
进口android.widget.TextView;
进口android.widget.Toast;

公共类MyArrayAdapter实现ListAdapter
{

    私人的ArrayList<分享Tweet>项目;
    私人上下文的背景下;
    私人的SimpleDateFormat的textFormat =新的SimpleDateFormat(E MMM DD HH:MM:SSžYYYY);

    公共MyArrayAdapter(TweetDbSource分贝,上下文语境)
    {
        项目=新的ArrayList<分享Tweet>();
        this.context =背景;
        光标光标= db.getReadableDatabase()查询(鸣叫,NULL,NULL,NULL,NULL,NULL,NULL);

        而(!cursor.isLast())
        {
                cursor.moveToNext();
                items.add(新资料Tweet(cursor.getLong(0),cursor.getLong(1),cursor.getString(2),cursor.getString(3),
                                cursor.getString(4),新日期(),cursor.getInt(6)));
        }
    }

    @覆盖
    公众诠释getCount将()
    {
        返回items.size();
    }

    @覆盖
    公共对象的getItem(INT位置)
    {
        返回items.get(位置);
    }

    @覆盖
    众长getItemId(INT位置)
    {
        返回的位置;
    }

    @覆盖
    公众诠释getItemViewType(INT为arg0)
    {
        // TODO自动生成方法存根
        返回0;
    }

    @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup)
    {
        LayoutInflater充气=(LayoutInflater)context.getSystemService(
        Context.LAYOUT_INFLATER_SERVICE
        );

        OnClickListener saveTweet =新OnClickListener()
        {
              公共无效的onClick(视图v)
              {
                  Toast.makeText(v.getContext(),拯救,Toast.LENGTH_LONG).show();
              }
        };
        查看tweetView = inflater.inflate(R.layout.tweet,NULL);

        TextView的textTweet =(TextView中)tweetView.findViewById(R.id.textTweet);
        textTweet.setText(items.get(位置).getTweet());

        textTweet =(TextView中)tweetView.findViewById(R.id.textUser);
        textTweet.setText(items.get(位置).getName());

        textTweet =(TextView中)tweetView.findViewById(R.id.textDate);
        textTweet.setText(textFormat.format(items.get(位置).getCreated()));

        返回tweetView;
    }


    @覆盖
    公众诠释getViewTypeCount()
    {
        // TODO自动生成方法存根
        返回1;
    }

    @覆盖
    公共布尔hasStableIds()
    {
        // TODO自动生成方法存根
        返回false;
    }

    @覆盖
    公共布尔的isEmpty()
    {
        // TODO自动生成方法存根
        返回items.size()== 0;
    }

    @覆盖
    公共无效registerDataSetObserver(DataSetObserver为arg0)
    {
        // TODO自动生成方法存根

    }

    @覆盖
    公共无效unregisterDataSetObserver(DataSetObserver为arg0)
    {
        // TODO自动生成方法存根

    }

    @覆盖
    公共布尔areAllItemsEnabled()
    {
        // TODO自动生成方法存根
        返回false;
    }

    @覆盖
    公共布尔的IsEnabled(INT为arg0)
    {
        // TODO自动生成方法存根
        返回false;
    }

}
 

吐司或记录不工作,那就是我可以告诉它不工作

更新getView方法

 公开查看getView(INT位置,查看convertView,父母的ViewGroup)
    {
             OnClickListener SaveView =新OnClickListener(){
             @燮pressLint(NewApi)
            公共无效的onClick(视图v)
             {
               Toast.makeText(v.getContext(),拯救,Toast.LENGTH_LONG).show();
               v.callOnClick();
             }
         };
            LayoutInflater充气=(LayoutInflater)context.getSystemService(
            Context.LAYOUT_INFLATER_SERVICE
            );
            查看tweetView = inflater.inflate(R.layout.tweet,NULL);

            TextView的textTweet =(TextView中)tweetView.findViewById(R.id.textTweet);
            textTweet.setText(items.get(位置).getTweet());

            textTweet =(TextView中)tweetView.findViewById(R.id.textUser);
            textTweet.setText(items.get(位置).getName());

            textTweet =(TextView中)tweetView.findViewById(R.id.textDate);
            textTweet.setText(textFormat.format(items.get(位置).getCreated()));
            tweetView.setOnClickListener(SaveView);
            返回tweetView;
    }
 

更新

这个问题解决了,我想通了:DI必须在这两种方法在我的适配器类返回的假真不是

  @覆盖
    公共布尔areAllItemsEnabled()
    {
        返回true;
    }

    @覆盖
    公共布尔的IsEnabled(INT为arg0)
    {
        返回true;
    }
 

解决方案

这通常是因为你的列表视图中的项目都在关注的焦点。尝试添加

 安卓descendantFocusability =blocksDescendants
 

在自定义列表视图行

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =FILL_PARENT
    机器人:layout_height =机器人:ATTR /列表preferredItemHeight
    机器人:填充=6dip
    机器人:方向=垂直
    机器人:descendantFocusability =blocksDescendants>
 

I am trying to write an application which takes items from a database and populates rows within a ListView. I can't click on the items after tapping on the rows and the dpad won't go to any of the rows either. I am using a custom Adapter.

Tweet.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="?android:attr/listPreferredItemHeight"
        android:padding="6dip" 
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" 
            android:orientation="horizontal" >

            <TextView
                android:id="@+id/textUser"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold" 
                android:text="NAME"/>

            <TextView
                android:id="@+id/textDate"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#333333"
                android:text="DATE" />

        </LinearLayout>

        <TextView
            android:id="@+id/textTweet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TWEET" />

    </LinearLayout>

Activity_main.xml

<?xml version="1.0" encoding="UTF-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    tools:context=".MainActivity" >

</ListView>

Oncreate Method

@Override
protected void onCreate(Bundle savedInstanceState)
{
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ListView view = (ListView) findViewById(R.id.listView);     
        MyArrayAdapter theAdapter = new MyArrayAdapter(tweetDb,this);

        //setContentView(theAdapter.getView(0, null, null));
        view.setAdapter(theAdapter);
        view.setOnItemClickListener( new OnItemClickListener()
        {

            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position,
                    long id) 
            {
                //Tweet theTweet = (Tweet)parent.getAdapter().getItem(position);
                //saved.insert(theTweet);
                Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_LONG).show();
                Log.v("SCHEMA", "onItemClick fired!");
            }
        } );
    }

Adapter Class getView

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(
    Context.LAYOUT_INFLATER_SERVICE
    );

    View tweetView = inflater.inflate(R.layout.tweet, null);

    TextView textTweet = (TextView)  tweetView.findViewById(R.id.textTweet);    
    textTweet.setText(items.get(position).getTweet());

    textTweet = (TextView)tweetView.findViewById(R.id.textUser);
    textTweet.setText(items.get(position).getName());

    textTweet = (TextView)tweetView.findViewById(R.id.textDate);
    textTweet.setText(textFormat.format(items.get(position).getCreated()));

    return tweetView;
}

MyArrayAdapter Class

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import android.content.Context;
import android.database.Cursor;
import android.database.DataSetObserver;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class MyArrayAdapter implements ListAdapter
{

    private ArrayList<Tweet> items;
    private Context context;
    private SimpleDateFormat textFormat = new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy");

    public MyArrayAdapter(TweetDbSource db, Context context)
    {
        items = new ArrayList<Tweet>();
        this.context = context;
        Cursor cursor = db.getReadableDatabase().query("Tweet", null, null, null, null, null, null);

        while (!cursor.isLast())
        {
                cursor.moveToNext();
                items.add(new Tweet(cursor.getLong(0),cursor.getLong(1),cursor.getString(2),cursor.getString(3),
                                cursor.getString(4),new Date(),cursor.getInt(6)));
        }
    }

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

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

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

    @Override
    public int getItemViewType(int arg0) 
    {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(
        Context.LAYOUT_INFLATER_SERVICE
        );

        OnClickListener saveTweet = new OnClickListener() 
        {
              public void onClick(View v) 
              {
                  Toast.makeText(v.getContext(), "Saved", Toast.LENGTH_LONG).show();
              }
        };
        View tweetView = inflater.inflate(R.layout.tweet, null);

        TextView textTweet = (TextView)  tweetView.findViewById(R.id.textTweet);    
        textTweet.setText(items.get(position).getTweet());

        textTweet = (TextView)tweetView.findViewById(R.id.textUser);
        textTweet.setText(items.get(position).getName());

        textTweet = (TextView)tweetView.findViewById(R.id.textDate);
        textTweet.setText(textFormat.format(items.get(position).getCreated()));

        return tweetView;
    }


    @Override
    public int getViewTypeCount() 
    {
        // TODO Auto-generated method stub
        return 1;
    }

    @Override
    public boolean hasStableIds() 
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isEmpty() 
    {
        // TODO Auto-generated method stub
        return items.size() == 0;
    }

    @Override
    public void registerDataSetObserver(DataSetObserver arg0) 
    {
        // TODO Auto-generated method stub

    }

    @Override
    public void unregisterDataSetObserver(DataSetObserver arg0) 
    {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean areAllItemsEnabled() 
    {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean isEnabled(int arg0) 
    {
        // TODO Auto-generated method stub
        return false;
    }

}

Toast or log is not working, that's how I can tell it's not working

Updated getView Method

public View getView(int position, View convertView, ViewGroup parent) 
    {
             OnClickListener SaveView = new OnClickListener() {
             @SuppressLint("NewApi")
            public void onClick(View v) 
             {
               Toast.makeText(v.getContext(), "Saved", Toast.LENGTH_LONG).show();
               v.callOnClick();
             }
         };
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(
            Context.LAYOUT_INFLATER_SERVICE
            );
            View tweetView = inflater.inflate(R.layout.tweet, null);

            TextView textTweet = (TextView)  tweetView.findViewById(R.id.textTweet);    
            textTweet.setText(items.get(position).getTweet());

            textTweet = (TextView)tweetView.findViewById(R.id.textUser);
            textTweet.setText(items.get(position).getName());

            textTweet = (TextView)tweetView.findViewById(R.id.textDate);
            textTweet.setText(textFormat.format(items.get(position).getCreated()));
            tweetView.setOnClickListener(SaveView);
            return tweetView;
    }

UPDATE

The issue was solved and I figured it out :D I had to return true instead of false in these two methods within my adapter class!

@Override
    public boolean areAllItemsEnabled() 
    {
        return true;
    }

    @Override
    public boolean isEnabled(int arg0) 
    {
        return true;
    }

解决方案

Usually this happens because the items in your listview are in focus. Try adding

android:descendantFocusability="blocksDescendants"

in your custom listview row

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip" 
    android:orientation="vertical"
    android:descendantFocusability="blocksDescendants">

这篇关于不能点击的ListView中的项目与自定义适配器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆