问题描述
- android中自定义ListView的单击事件不响应
-
本人创建了自定义ListAdapter,但是每行的单击事件不响应,应该实现的是点击之后获取这行的一些内容然后在另外的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("http://www.julianfuerderer.de/json.php"); 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输出,得到:// Output o.toString(): com.example.customlistview.MainActivity$Person@41252310 Log.i("TEST", o.toString())
我想输出的是内容,比如name或者id。
解决方案
看看你有没有在xml中把点击事件屏蔽掉,再看看 你在adapter里面的contentview 里面有没有绑定点击时间,在adaper里面绑定了事件,listview.setonitemclicklistener 会捕捉不到点击事件
解决方案二:
怎么不响应了?
解决方案三:
Log.i("TEST", arrayOfWebData[position].name);
如果没反应,在ListView里面加
android:focusable="false"
android:focusableInTouchMode="false"
解决方案四:
你在onItemClick并没有进行什么可以跳转的操作啊,怎么知道它没有执行呢?
解决方案五:
你没有绑定ListView 单项item 事件
解决方案六:
setOnItemOnClick试一下,可以能是因为你没有给单个选项添加事件
解决方案七:
焦点抢夺?你的listview 里面有没有button imagebutton?
解决方案八:
参考一下这个:ListView
解决方案九:
你不是有arrayOfWebData这个List嘛, 你可以直接在OnItemClick里面写arrayOfWebData.getPosition(position)来获取点击那一条的内容,如果你的arrayOfWebData不是全局变量,你可以重新声明一个内容和这个一样。不必存在object里面。
解决方案十:
android:descendantFocusability="blocksDescendants" 加上这句代码
时间: 2024-11-02 06:47:19