首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法使用自定义适配器单击ListView中的项目

无法使用自定义适配器单击ListView中的项目
EN

Stack Overflow用户
提问于 2013-03-12 10:54:22
回答 5查看 27.5K关注 0票数 20

我正在尝试编写一个应用程序,它从数据库中获取项并填充ListView中的行。在点击行之后,我不能点击项目,dpad也不会转到任何行。我使用的是自定义适配器。

Tweet.xml

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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方法

代码语言:javascript
复制
@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!");
            }
        } );
    }

适配器类getView

代码语言:javascript
复制
@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类

代码语言:javascript
复制
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或log不工作,这就是我如何判断它不工作的原因

已更新getView方法

代码语言:javascript
复制
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;
    }

更新

这个问题已经解决了,我想明白了:我必须在我的适配器类中的这两个方法中返回true而不是false!

代码语言:javascript
复制
@Override
    public boolean areAllItemsEnabled() 
    {
        return true;
    }

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

回答 5

Stack Overflow用户

发布于 2013-03-14 21:25:21

通常发生这种情况是因为列表视图中的项处于焦点中。尝试添加

代码语言:javascript
复制
android:descendantFocusability="blocksDescendants"

在自定义列表视图行中

代码语言:javascript
复制
<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">
票数 67
EN

Stack Overflow用户

发布于 2013-03-12 11:09:44

我通常将单击侦听器放在适配器本身中:

代码语言:javascript
复制
@Override
      public View getView(int position, View convertView, ViewGroup parent) {

        OnClickListener yourClickListener = new OnClickListener() {
              public void onClick(View v) {
                //put your desired action here
                v.callOnClick();
              }
          };

    ...

    // then add the listener to your view
    tweetView.setOnClickListener(yourClickListener);
票数 1
EN

Stack Overflow用户

发布于 2013-03-12 11:27:19

add inside onItemClick方法:

代码语言:javascript
复制
v.setSelected(true);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15352486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档