2013-03-12 3 views
17

とリストビュー内の項目をクリックすることはできません。私は行をタップした後に項目をクリックすることはできません.dpadはいずれかの行にも移動しません。私はカスタムアダプタを使用しています。は、私は、データベースから項目を取り、リストビュー内の行を移入するアプリケーションを記述しようとしていますカスタムアダプタ

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メソッド

@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メソッド

@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クラス

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; 
    } 

} 

トーストやログが機能していない、それは私がそれをgetViewメソッドメソッド

を更新しました

を働いていない伝えることができる方法です

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

問題が解決し、私はそれを考え出した:D私は私のアダプタクラス内でこれらの二つの方法で真の代わりに、falseを返す必要がありました!

android:choiceMode="singleChoice" 
+0

convertViewを再利用することをお勧めしますが、(convertView == null)場合は、それを膨らませる必要があります。それ以外の場合はconvertView –

+0

を再利用すると、問題の原因となる可能性のあるMyArrayAdapterコードを含めるべきです。 – andr

+0

私はMyArrayAdapterクラスコードと素早く返信用 – AndroidNoob

答えて

1

は、私は通常、アダプタ自体にクリックリスナーを置きます
+0

感謝を含めます!大変感謝しています! 唯一のことは、少なくとも行のいずれかをクリックしても見えないことです。少なくとも強調表示されていません。 – AndroidNoob

+0

トーストは機能しましたが、押されたときに行は視覚的なフィードバックを示していませんか?またはトーストはまだ機能しませんでしたか?最新のアダプターコードを確認すると良いでしょう。 – TrippinBilly

+0

ここに投稿されたすべてのソリューションを試してもまだ動作しませんでした。私が今書いたコードは、私のアダプタの最新コードです – AndroidNoob

-1

があなたのListView XMLに以下の行を追加します:

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

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

は、Androidのバージョン<3 – AndroidNoob

+0

動作しない –

+0

です。 – AndroidNoob

0

onItemClickメソッド内で追加

@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); 
+0

これはどのように動作するはずですか? OPはToastとLogのどちらも動作していないので、onItemClick()が呼び出されていないようだ。 – andr

57

通常これはbecaリストビュー内の項目にフォーカスがある場合は使用します。これを試し

android:descendantFocusability="blocksDescendants" 
カスタムリストビューの列の

<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"> 
+2

それはすべていいですね、私はちょうどセットのareAllItemsEnabledをtrueに加えてtrueにisEnabledを加えなければなりませんでした。 – AndroidNoob

+0

私は過去にこのソリューションを試してみましたが、アダプターのトリックではうまくいきませんでした。おかげで、私は助けてくれることを感謝します! – AndroidNoob

+1

私にとって、この 'descendantFocusability'ソリューションはうまくいっていて、' areAllItemsEnabled'/'isEnabled'はしませんでした。理由が分からない。 –

-2

を追加してみてください?

 @Override 
    public boolean isEnabled(int position) { 
     //Set a Toast or Log over here to check. 
     return true; 
    } 
関連する問題