gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:43:21 25 4
gpt4 key购买 nike

我已经构建了一个自定义的 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 类中的字段是公开的,因此您可以像这样访问它们。

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com