Добавление onClickListener в список - PullRequest
1 голос
/ 03 января 2012

Я довольно новичок в Android, и у меня есть вопрос. Я играю с простым учебником по клиенту Twitter, который находится на github. однако мне не удается заставить onClickListener работать должным образом. Как я могу получить положение любого элемента в списке, по которому щелкают?

Я пытался поиграть, комбинируя уроки без удачи.

Вот код: https://github.com/cacois/TweetView/blob/progress_bar/src/com/example/TweetItemAdapter.java

package com.example;

import java.util.ArrayList;

import com.example.Example.Tweet;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

public class TweetItemAdapter extends ArrayAdapter<Tweet> {
    private ArrayList<Tweet> tweets;
    private Activity activity;
    public ImageManager imageManager;

    public TweetItemAdapter(Activity a, int textViewResourceId, ArrayList<Tweet> tweets) {
        super(a, textViewResourceId, tweets);
        this.tweets = tweets;
        activity = a;

        imageManager = 
            new ImageManager(activity.getApplicationContext());
    }

    public static class ViewHolder{
        public TextView username;
        public TextView message;
        public ImageView image;
        public ProgressBar progress; //ADDED
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        ViewHolder holder;
        if (v == null) {        
            LayoutInflater vi = 
                (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.listitem, null);
            holder = new ViewHolder();
            holder.username = (TextView) v.findViewById(R.id.username);
            holder.message = (TextView) v.findViewById(R.id.message);
            holder.image = (ImageView) v.findViewById(R.id.avatar);
            holder.progress = (ProgressBar) v.findViewById(R.id.progress_bar); //ADDED
            v.setTag(holder);
        }
        else
            holder=(ViewHolder)v.getTag();

        final Tweet tweet = tweets.get(position);
        if (tweet != null) {
            holder.username.setText(tweet.username);
            holder.message.setText(tweet.message);
            holder.image.setTag(tweet.image_url);
            imageManager.displayImage(tweet.image_url, activity, holder.image, holder.progress); //CHANGED
        }
        return v;
    }
}

Ответы [ 5 ]

2 голосов
/ 03 января 2012

Вместо того, чтобы присоединять OnClickListener к представлению, проще просто переопределить onListItemClick в вашем ListActivity. Если вы не используете ListActivity, используйте setOnItemClickListener в самом ListView для регистрации объекта AdapterView.OnItemClickListener.

EDIT

Предполагая, что вы используете подкласс ListActivity для хранения вашего списка, сделайте что-то вроде этого:

public class MyListActivity extends ListActivity {
    // . . .

    protected void onListItemClick(ListView l, View v, int position, long id) {
        // process click on item #position
        Tweet item = (Tweet) l.getItemAtPosition(position);
    }
}
2 голосов
/ 03 января 2012

В методе getView используйте это:

v.addOnClickListener(new OnClickListener() {
    public void onClick(View view) {
        // do some stuff with the view that has been clicked
    }
});

Когда вы щелкаете элемент, вызывается соответствующая функция, потому что вы теперь указали, что должно происходить с каждым представлением при нажатии на него.

1 голос
/ 09 января 2012

ок разобрался что делать.Вот решение на случай, если у кого-то возникнет такая же проблема:

listView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        Log.v("position", String.valueOf(position));
    }
});

, это входит в основное действие сразу после listView.setAdapter

1 голос
/ 03 января 2012

Вам необходимо использовать http://developer.android.com/reference/android/widget/AdapterView.html#setOnItemClickListener(android.widget.AdapterView.OnItemClickListener)

и

http://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html

При нажатии на элемент onItemClick будет передана позиция щелчка элемента, и вы можете использовать это и ArrayAdapter getItem(int position) для доступа к элементу и выполнения операции.

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

final ListView listView = getListView();
listView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> paramAdapterView, View paramView, int paramInt,
                long paramLong) {
            // TODO whatever you want to do to this item               
        }
    });
0 голосов
/ 03 января 2012

Реализуйте OnItemClickListener в своей деятельности и добавьте неосуществленные методы.

public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
            System.out.println(position);
}

Установите onItemClickListener для вашего объекта списка, например

list.setOnItemClickListener(this);

ваш класс должен реализовывать следующее

public class YourClass extends Activity implements OnItemClickListener {

Вот так.

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