2012-04-03 7 views
2

私は内部にEditTextを持つListViewを持っています。 実際にListviewの要素に触れると、EditTextにフォーカスがあり、キーボードが現れました。良い。 問題は、私はこのEditTextでlistViewのonItemClickListenerを通して何かしたいですが、私のコードは決してこのメ​​ソッドに入力しないようです。リストビュー、onItemClickListenerとEditText

私はリストビューにsetDescendantFocusabilityをいくつか試しますが、問題は解決しません。

ありがとうございます。

public class NoteAdapter extends BaseAdapter { 

private ArrayList<String> notes; 
private LayoutInflater inflater; 
private Context context; 

public NoteAdapter(Context context, ArrayList<String> notes) { 
    inflater = LayoutInflater.from(context); 
    this.notes = notes; 
    this.context = context; 
} 

public int getCount() { 
    // TODO Auto-generated method stub 
    return notes.size(); 
} 

public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return notes.get(position); 
} 

public long getItemId(int id) { 
    // TODO Auto-generated method stub 
    return id; 
} 


private class ViewHolder { 
    EditText note; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    ViewHolder holder; 
    if(convertView == null) { 
     holder = new ViewHolder(); 
     convertView = inflater.inflate(R.layout.listenote, null); 
     holder.note = (EditText)convertView.findViewById(R.id.note); 


     convertView.setTag(holder); 
    }else { 
     holder= (ViewHolder) convertView.getTag(); 
    } 

    holder.note.setText(notes.get(position)); 

    return convertView; 


} 


} 

私の主な活動

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    notes = new ArrayList<String>(); 
    for(int i=0; i< 10; i++) 
     notes.add("note"+i); 
    EditTextSelected = null; 

    adapter = new NoteAdapter(this, notes); 
    lv1 = ((ListView)findViewById(R.id.listeNote)); 
    lv1.setAdapter(adapter); 
    lv1.setClickable(true); 

    lv1.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
      Toast t = Toast.makeText(FastItActivity.this, "hello", 200); 
      t.show(); 

     } 
    }); 

listenote.xml

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout 
android:id="@+id/widget1" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android"> 


    <EditText 
    android:id="@+id/note" 
    android:textColor="@color/black" 
    android:textSize="12dp" 
    android:layout_width="wrap_content" 
    android:layout_height="40dp" 
    android:padding="5dp" 
    android:inputType="textMultiLine" 
    android:scrollHorizontally="false" 
    android:gravity="top|left" 
    android:ems="10" 
    android:layout_margin="10dp" 
    android:background="@drawable/fond_note" 
    /> 



</TableLayout> 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout 
android:id="@+id/widget1" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:background="@drawable/wooden_top" 

> 

<ListView 
    android:id="@+id/listeNote" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="10dp" 
    android:background="@android:color/transparent" 
    android:cacheColorHint="#00000000" 
    android:isScrollContainer="false" 
    android:divider="#00000000" 

    > 
</ListView> 


</TableLayout> 
+0

は、あなたがしたいです何の行動説明

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <userInterface.IndexedEditText android:id="@+id/et_first_item" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:hint="@string/select" android:inputType="none" /> <!-- other views --> </RelativeLayout> 

はあなたのOnClickListenerIndexedEditTextインスタンスのをgetViewlistIndexを設定し、設定します参照してください、ユーザーは何をしていますか?たぶんあなたは 'ListView'の' onClickListener'と 'EditText'のフォーカスを結線する必要はないかもしれません –

+0

私が望むのは、リスト内の項目をクリックするとキーボードが現れ、選択されたノート、高さ(ラップコンテンツ)などを変更する...もちろん、実際には、私はイベントを(トーストで)キャッチしようとします。 – Dahevos

+0

なぜこのためのキーボードが必要ですか?たとえば、アイテムがクリックされたときにコンテキストメニューを表示してから、編集オプション(色、高さを変更)などを選択します。 –

答えて

2

onClickListener

NoteAdapterさんgetView 'では、あなたのEditTextにS onItemClickListener' ListViewから修正を動かし:

holder.note = (EditText)convertView.findViewById(R.id.note); 
holder.note.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //do something 
     } 

    }); 

またはこれ試してみてください。

holder.note.setOnFocusListener(new View.OnFocusListener(){ 
@Override  
public void onFocus(){ 
    //do something 
    } 
} 

getView方法はを持っているがポジションパラメータを使用して、がクリックされたものを区別できるようになります(別の操作で別のものが必要な場合)

+0

ありがとう、私はそれをしました。問題は、アイテムをダブルクリックしたときにのみonClickイベントが表示されるようになったことです。実際、最初のクリックはキーボードを開きますが、setOnCLickListenerは「アクティブ」ではありません。 edittextをもう一度クリックすると、最後にonClickListenerがアクティブになります。 最初のクリックでonClickを直接アクティブにする方法はありますか? (ワンクリックでキーボードが現れ、イベントが処理されます) – Dahevos

+0

私の投稿を更新しました。 'setOnFocusListener'を試してください –

0

は、この記事ではかなり長いですが、途中/終わりに向かって彼が実証しますインタラクティブなリストビューwちょうどあなたが必要とするものです。 http://www.vogella.de/articles/AndroidListView/article.html

役立つコードを投稿できる場合は、

+0

それはイベント自体を管理するボタンです。私はそれをしましたが、私はEditTextで時間をクリックすると、私はキーボードがあり、私はイベントを持つためにEditTextで別の時間をクリックする必要があります。以上、私はlistviewでこのイベントを管理することを好む。とにかくありがとう; – Dahevos

+0

申し訳ありませんが、stackoverflowのコードを書式設定するのに時間がかかりました。 setDescendatについては、効果がなかったので投稿したコードで削除しました。どうも。 – Dahevos

0

私は同様の問題を解決しようとしていました。リストアイテム?

リスト内の各項目に対して新しいリスナーの作成を拒否します。そのようなリソースが制約されたプラットフォームでは規模が大きくなるとは想像もできません。しかし、onClickで選択したインデックスを設定して取得するために、EditTextを特化してこの問題を解決できることがわかりました。

は、あなたの専門分野を定義します。

package userInterface; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.EditText; 

public class IndexedEditText extends EditText { 
    public int listIndex; 

    public IndexedEditText(Context context) { 
     super(context); 
    } 

    public IndexedEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public IndexedEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 
} 

リスト項目 XML宣言であなたの専門のクラスのためのあなたのEditTextを交換してください。新しいクラスへのパスを取得してください(私の場合、それはuserInterface.IndexedEditTextです)。

public abstract class EditTextPairArrayAdapter <T> extends ArrayAdapter<T> { 

    LayoutInflater inflater; 

    static class ViewHolder { 
     private WeakReference<IndexedEditText> name; 
     private WeakReference<EditText> notes; 

     public ViewHolder(IndexedEditText tv, EditText et) { 
      name = new WeakReference<IndexedEditText>(tv); 
      notes = new WeakReference<EditText>(et); 
     } 
    } 


    int textViewId; 
    int editTextId; 
    int listItemId; 
    List<T> list = null; 
    WeakReference<Context> contextRef; 


    //context is Activity that instantiates this array adapter 
    //resourceId is the layout xml ID for your special row 
    //textViewResourceId is any TextView ID in your special row xml def 
    //editTextResourceId means nothing in this context 
    //objects is the initial list of objects to present in UI 
    public EditTextPairArrayAdapter(Context context, int resourceId, int textViewResourceId, int editTextResourceId, List<T> objects) { 
     super(context, resourceId, textViewResourceId, objects); 

     this.listItemId = resourceId; 
     this.textViewId = textViewResourceId; 
     this.editTextId= editTextResourceId; 
     this.list = objects; 
     this.contextRef = new WeakReference<Context>(context); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 
     View  view  = null; 
     ViewHolder viewHolder = null; 

     if (convertView == null) { 
      if(inflater == null) 
       inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(listItemId, null); 

      IndexedEditText text = (IndexedEditText)view.findViewById(textViewId); 
      EditText notes = (EditText) view.findViewById(editTextId); 

      text.listIndex = position; 
        //Special sauce 

      if(contextRef != null && contextRef.get() != null && (contextRef.get() instanceof View.OnClickListener)) { 
       text.setOnClickListener((View.OnClickListener) contextRef.get()); 
      } 

      viewHolder = new ViewHolder(text, notes); 

      view.setTag(viewHolder); 
     } 
     else { 
      view = convertView; 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 


     Titem = this.getItem(position); 
     if(item != null) { 
      //special sauce 
     } 

     return view; 
    } 

    //add abstract methods for implementations to define special sauce 
} 

最後に、あなたの活動に実装さOnClickListener:

public void onClick(View v) { 
    if(v instanceof IndexedEditText) { 
     Object obj = myList.get(((IndexedEditText)v).listIndex); 
     //do stuff with obj   
    } 
} 
関連する問題