自定义 ListView 适配器上的 Android onclick 事件不起作用

标签 android listview

我已经构建了一个自定义 ListAdapter,但 onclick 事件出现问题 对于每一行。我想获取点击行的一些内容 稍后在另一个 Activity 中使用它:

public class MainActivity extends Activity {

// ArrayList of type "Person". We are making not a list of string, sondern eine list of persons
ArrayList<Person> arrayOfWebData = new ArrayList<Person>();

class Person{
    public String person_id;
    public String name;
    public String birthday;
    public String favorite_color;
    public String profilbild;
}

// This is our new Adapter:
FancyAdapter aa = null;

// For each row we returned until we use the array to create our person obj
static ArrayList<String> resultRow;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    new getJson().execute();
}

// Params,Progress,Result
private class getJson extends AsyncTask<Void,Void,Void>
{
    @Override
    protected Void doInBackground(Void... arg0) {
        String result = "";
        try{
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost("xxxxx");
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            InputStream is = httpEntity.getContent();
            // Convert response to String:
            try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;

                while((line = reader.readLine()) != null){
                    sb.append(line+"\n");
                }
                is.close();
                result = sb.toString();
            }catch(Exception e){
                e.printStackTrace();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        // Parse JSON:
        try{
            JSONArray jArray = new JSONArray(result);
            for(int i = 0;i < jArray.length();i++)
            {
                // Get our object, this is on persons data:
                JSONObject json_data = jArray.getJSONObject(i);
                // Create a new person:
                Person resultRow = new Person();
                // Set thats persons attributes:
                resultRow.person_id = json_data.getString("id");
                resultRow.name = json_data.getString("name");
                resultRow.favorite_color = json_data.getString("favorite_color");
                resultRow.birthday = json_data.getString("birthday");
                resultRow.profilbild = json_data.getString("profilbild");
                arrayOfWebData.add(resultRow);
            }   
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;    
    }
    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        populateListView();
    }   
}


public void populateListView()
{
    final ListView myListView = (ListView)findViewById(R.id.myListView);
    // initialite FancyAdapter object:
    aa = new FancyAdapter();
    myListView.setAdapter(aa);  

    // Click on ListView Row:
    myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    {
          @Override
          public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
          {
                 Object o = myListView.getItemAtPosition(position);
                // Here i want have values of the clicked row,- like the name and/or id...,- but i get the following:
                // Output o.toString(): com.example.customlistview.MainActivity$Person@41252310
                Log.i("TEST", o.toString()); 

                // Here i intend to Start a new Activity passing the "name" of the user (and/or id ...) to the new activity
          }
    }); 
}


class FancyAdapter extends ArrayAdapter<Person>
{
    FancyAdapter(){
        super(MainActivity.this,android.R.layout.simple_list_item_1,arrayOfWebData);
        //imageLoader = new ImageLoader(MainActivity.this);
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if(convertView == null){
            LayoutInflater inflater = getLayoutInflater();
            convertView = inflater.inflate(R.layout.row3, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder); 
        }else{
            holder = (ViewHolder)convertView.getTag();
        }
        holder.populateFrom(arrayOfWebData.get(position));
        return convertView; 
    }
}

class ViewHolder
{
    public TextView name = null;
    public TextView birthday = null;
    public TextView favorite_color = null;
    public ImageView profilbild = null;
    //public ImageLoader imageLoader;
    ImageLoader imageLoader = new ImageLoader(MainActivity.this);

    ViewHolder(View row){
        name = (TextView)row.findViewById(R.id.name);
        birthday = (TextView)row.findViewById(R.id.birthday);
        favorite_color = (TextView)row.findViewById(R.id.favorite_color);
        profilbild = (ImageView)row.findViewById(R.id.imageView1);  
    }
    // Notice we have to change our populateFrom() to take an argument of type "Person"
    void populateFrom(Person r){
        name.setText(r.name);
        birthday.setText(r.birthday);
        favorite_color.setText(r.favorite_color);
        imageLoader.DisplayImage(r.profilbild, profilbild); 
    }   
}

请查看 populateListView() 方法。 运行应用程序并单击一行时,我在 Log.i 中看到的输出如下:

// Output o.toString():
com.example.customlistview.MainActivity$Person@41252310 Log.i("TEST", o.toString());

但我想从行中获取一些内容,例如名称或 ID。

我怎样才能做到这一点?

最佳答案

我猜测您的Adapter 包含Person 类型的对象。由于 Person 类中的字段是公共(public)的,因此您可以像这样访问它们。

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
{
    // Get Person "behind" the clicked item
    Person p = (Person) myListView.getItemAtPosition(position);

    // Log the fields to check if we got the info we want
    Log.i("SomeTag", "Persons name: " + p.name);
    Log.i("SomeTag", "Persons id : " + p.person_id);

    // Do something with the data. For example, passing them to a new Activity

    Intent i = new Intent(MainActivity.this, NewActivity.class);
    i.putExtra("person_id", p.person_id);
    i.putExtra("person_name", p.name);

    MainActivity.this.startActivity(i);  
}

关于自定义 ListView 适配器上的 Android onclick 事件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14188685/

相关文章:

wpf - 如何在ListView中显示行号?

android - 实现 GoogleApiClient 时遇到问题

java - 无法从 RecyclerView 中的 URL 加载图像

java - 如何在 OpenGL ES 2 中使用顶点数组对象

安卓 : simple_list_item_activated_1 : Listview change default blue color

android - 使用 searchview 和搜索建议以及语音搜索过滤 recyclerview

c# - ListView.SelectedItems[0] 选择错误

android - Facebook 广告 + GDPR 合规性

java - 自定义 View 和 ImageView 之间的像素完美碰撞检测

listview - 在 JavaFX 中更新 ListView 时出现 IndexOutOfBoundsException