Listview, onItemClickListener и EditText - PullRequest
       16

Listview, onItemClickListener и EditText

3 голосов
/ 03 апреля 2012

У меня есть ListView с EditText внутри.На самом деле, когда я касаюсь элемента Listview, у EditText появляется фокус, и появляется клавиатура.Хорошо.Проблема в том, что я хочу что-то сделать с этим EditText с помощью onItemClickListener listView, но, похоже, мой код никогда не вводится в этот метод.1006 *

Большое спасибо.

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>

Ответы [ 3 ]

2 голосов
/ 04 апреля 2012

Переместите ваши модификации из ListView onItemClickListener в EditText onClickListener

В NoteAdapter getView:

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 метод имеет параметр position , поэтому вы сможете различить, на что нажали EditText (если вам нужны разные действия с разными EditTexts)

0 голосов
/ 30 августа 2013

Я пытался решить похожую проблему: какой элемент в списке был выбран, когда вы встраивали несколько представлений в элемент списка ?!

Я отказываюсь создавать нового слушателя для каждого элемента в списке. Я не могу себе представить, что это будет хорошо масштабироваться на такой ресурсной платформе. Но я обнаружил, что вы можете решить эту проблему, указав EditText для установки и извлечения выбранного индекса в onClick.

Определите свою специализацию:

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

Замените ваш EditText для вашего специализированного класса в списке item XML декларация. Не забудьте правильно указать путь к вашему новому классу (в моем случае это userInterface.IndexedEditText).

<?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>

Установите listIndex в getView и установите OnClickListener для каждого 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         
    }
}
0 голосов
/ 03 апреля 2012

Эта статья довольно длинная, но ближе к середине / концу он демонстрирует интерактивный просмотр списка, который именно то, что вам нужно. http://www.vogella.de/articles/AndroidListView/article.html

Если бы вы могли опубликовать код, который бы помог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...