初次使用时ViewHolder
图案。第二次延长时BaseAdapter
not AdapterView
。第三次删除时android:clickable="true"
from row.xml
。可点击状态必须有ListView
在方法中onItemClickListener
,不是自己的行。
Updated
对于自定义列表视图,您可以使用 BaseAdapter。
对于适配器类,您有一些使其顺利进行的技巧,您可以参考this
它还涉及已创建的行的控件实例的可重用性。对于 ViewHolder 模式,我更喜欢用来保存对象。请检查this了解更多详情
适配器的 getView 方法的代码中缺少该内容。
有关更多解释,我在适配器的 getView 方法中留下评论。
如果要使用命名约定,则保存详细信息的类应该是正确的
这里首先名称是“Object”,这是错误的。
活动
private ListView list;
private final ArrayList<RestaurantsDetails> pairs = new ArrayList<RestaurantsDetails>();
private Activity context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pairs.add(new RestaurantsDetails("McDonald's", "mcd"));
pairs.add(new RestaurantsDetails("Subway", "mcd"));
pairs.add(new RestaurantsDetails("Pizza Hut", "mcd"));
pairs.add(new RestaurantsDetails("Burger King", "mcd"));
list = (ListView) findViewById(R.id.listview);
AdapterViewCustom adapter = new AdapterViewCustom(this, pairs);
list.setAdapter(adapter);
list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(android.widget.AdapterView<?> parent,
View view, int position, long id) {
Toast.makeText(getApplicationContext(),
pairs.get(position).name, Toast.LENGTH_LONG).show();
}
});
}
数据层类
/**
* Use proper name For the class. Should not use the name like "Object" or
* the class which is already used by framework
*
*/
public class RestaurantsDetails {
public String name;
public String img;
public RestaurantsDetails(String name, String img) {
this.name = name;
this.img = img;
}
}
Adapter
public class AdapterViewCustom extends BaseAdapter {
private Activity context_1;
private ArrayList<RestaurantsDetails> pairs;
public AdapterViewCustom(Activity context,
ArrayList<RestaurantsDetails> pairs) {
context_1 = context;
this.pairs = pairs;
}
@Override
public int getCount() {
return pairs.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context_1).inflate(
R.layout.custom_row, null);
viewHolder = new ViewHolder();
viewHolder.img = (ImageView) convertView
.findViewById(R.id.log_img);
viewHolder.txt = (TextView) convertView
.findViewById(R.id.tv_view);
/**
* At very first time when the List View row Item control's
* instance is created it will be store in the convertView as a
* ViewHolder Class object for the reusability purpose
**/
convertView.setTag(viewHolder);
} else {
/**
* Once the instance of the row item's control it will use from
* already created controls which are stored in convertView as a
* ViewHolder Instance
* */
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.txt.setText(pairs.get(position).name);
int id = context_1.getResources().getIdentifier(
pairs.get(position).img, "drawable",
context_1.getPackageName());
viewHolder.img.setImageResource(id);
return convertView;
}
public class ViewHolder {
public final ImageView img;
public final TextView txt;
}
}