listview onitemclicklistener для пользовательского макета

1

У меня есть listview:

   <ListView
        android:clickable="true"
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

элементы, которые входят внутрь, выглядят следующим образом:

<?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="fill_parent"
    android:orientation="horizontal" >




    <TextView
        android:id="@+id/textview_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.76"
        android:text="Choose"
        android:clickable="true" />


    <EditText
        android:id="@+id/edittext_share"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.12"
        android:ems="10"
        android:hint="share"
        android:inputType="number" >

        <requestFocus />
    </EditText>


    <EditText
        android:id="@+id/edittext_spent"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.11"
        android:ems="10"
        android:hint="spent"
        android:inputType="number" />

</LinearLayout>

Я хочу, чтобы при нажатии на TextView что-то должно произойти. Я установил setOnItemClickListener через getListView() но он не работает.

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    // TODO Auto-generated method stub
    Toast.makeText(this,"clicked id="+arg2, Toast.LENGTH_SHORT).show();
}

а также

        ListView lv = getListView();
    lv.setOnItemClickListener(this);

Что мне делать, чтобы сделать textview доступным?

EDIT: мой код адаптера:

    private class PeopleListAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    public Cursor cursor;
    public ArrayList<PersonInfo> peopleList;
    public ArrayList<PersonInfo> unsavedPeopleList;

    public PeopleListAdapter(Context context, Cursor cursor) {
        // Cache the LayoutInflate to avoid asking for a new one each time.
        mInflater = LayoutInflater.from(context);
        this.cursor = cursor;
        peopleList = new ArrayList<PersonInfo>(cursor.getCount());
    }

    public PeopleListAdapter(Context context, Cursor cursor,
            ArrayList<PersonInfo> unsavedList) {
        this(context, cursor);
        this.unsavedPeopleList = unsavedList;
    }

    /**
     * The number of items in the list is determined by the number of
     * speeches in our array.
     * 
     * @see android.widget.ListAdapter#getCount()
     */
    public int getCount() {
        return peopleList.size() + unsavedPeopleList.size();
    }

    /**
     * Since the data comes from an array, just returning the index is
     * sufficent to get at the data. If we were using a more complex data
     * structure, we would return whatever object represents one row in the
     * list.
     * 
     * @see android.widget.ListAdapter#getItem(int)
     */
    public Object getItem(int position) {

        return position;
    }


    /**
     * Use the array index as a unique id.
     * 
     * @see android.widget.ListAdapter#getItemId(int)
     */
    public long getItemId(int position) {
        return position;
    }

    /**
     * Make a view to hold each row.
     * 
     * @see android.widget.ListAdapter#getView(int, android.view.View,
     *      android.view.ViewGroup)
     */
    public View getView(int position, View convertView, ViewGroup parent) {
        // A ViewHolder keeps references to children views to avoid
        // unneccessary calls
        // to findViewById() on each row.
        ViewHolder holder;

        // When convertView is not null, we can reuse it directly, there is
        // no need
        // to reinflate it. We only inflate a new View when the convertView
        // supplied
        // by ListView is null.
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item_person_info,
                    null);

            // Creates a ViewHolder and store references to the two children
            // views
            // we want to bind data to.
            holder = new ViewHolder();
            holder.name = (TextView) convertView
                    .findViewById(R.id.textview_name);
            holder.share = (EditText) convertView
                    .findViewById(R.id.edittext_share);
            holder.spent = (EditText) convertView
                    .findViewById(R.id.edittext_spent);
            convertView.setTag(holder);

        } else {
            // Get the ViewHolder back to get fast access to the TextView
            // and the ImageView.
            holder = (ViewHolder) convertView.getTag();
        }

        // Bind the data efficiently with the holder.
        PersonInfo p = getPersonInfo(position);
        holder.name.setText(p.name);
        holder.name.setTag(p.lookupUri);
        holder.share.setText(p.share + "");
        holder.spent.setText(p.spent + "");

        return convertView;
    }

    PersonInfo getPersonInfo(int position) {
        if (position < peopleList.size()) {
            PersonInfo pInfo = peopleList.get(position);
            if (pInfo == null) {
                pInfo = new PersonInfo();
                cursor.moveToPosition(position);
                pInfo.lookupUri = Uri.parse(cursor.getString(0));
                Cursor c = NewEventActivity.this.getContentResolver()
                        .query(pInfo.lookupUri,
                                new String[] { Contacts._ID,
                                        Contacts.DISPLAY_NAME }, null,
                                null, null);
                pInfo.share = cursor.getInt(1);
                pInfo.spent = cursor.getInt(2);
                try {
                    if (c.moveToFirst()) {
                        pInfo.name = c.getString(1);
                    }
                } finally {
                    cursor.close();
                }
                peopleList.set(position, pInfo);

            }

            return pInfo;
        } else {
            return unsavedPeopleList.get(position - peopleList.size());
        }
    }
  • 0
    Пожалуйста, предоставьте вам код адаптера .......
  • 0
    Вы пробовали на onListItemClick
Показать ещё 1 комментарий
Теги:
onitemclicklistener
android-listview

4 ответа

2
Лучший ответ

Вам нужно установить прослушиватель прослушивателя Click в TextView в адаптере в функции getView()......

посмотреть ссылку

        private class PeopleListAdapter extends BaseAdapter implements
OnClickListener {

     ..............................
      ............................


public View getView(int position, View convertView, ViewGroup parent) {
       
             ......................
           .....................
        holder.name.setText(p.name);
        //holder.name.setTag(p.lookupUri);
        holder.share.setText(p.share + "");
        holder.spent.setText(p.spent + "");

        holder.name.setOnClickListener(this);
       holder.name.setTag(position);



        return convertView;
    }

     @Override
    public void onClick(View v) {
        Log.d("Sample", "Clicked on tag: " + v.getTag());
        ////get PersonInfo using getPersonInfo(position) 
    }
  • 0
    какой-то код был бы великолепен .. :)
  • 0
    Он использует listactivity так, как бы там функционировал getView() ?
Показать ещё 18 комментариев
2

Если вы используете ListActicvity, тогда доступен метод по умолчанию, называемый onListItemClick(). Вы должны переопределить этот метод в ListActivity,

protected void onListItemClick(android.widget.ListView l, android.view.View v, int position, long id) {

        //find which item is clicked using the view object
    };
  • 0
    `@Override protected void onListItemClick (ListView l, View v, int position, long id) {// TODO Сгенерированный автоматически метод заглушки Toast.makeText (this," hi ", Toast.LENGTH_LONG) .show (); super.onListItemClick (l, v, position, id); } `
  • 0
    я прошу прощения. не понимаю
Показать ещё 3 комментария
0

Из того, что я понял, это то, что вы хотите: вы хотите, чтобы TextView внутри ListView был доступен для кликабеля, выполнял некоторую операцию на основе этого, и у вас есть элементы с пользовательским расположением внутри ListView

Итак: setOnItemClickListener не будет работать, потому что он добавляет слушателя для всего элемента внутри ListView, а не для элементов внутри него.

Для этого вы можете сделать это: добавьте тег к элементам внутри вашего ListView и внутри метода getView вам предоставляется позиция по умолчанию, используя это и используя тег с помощью метода getTag(), вы можете различать, что было нажато и в xml вы можете просто объявить onClick() и предоставить его определение

0

Установить на ClickListener В методе getListView() TextView.

Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню